草庐IT

划水日常(16.5)关于出版图书有偿征集书名 ~

前端江太公 2023-04-05 原文

关于摸鱼日常已经断更两个月了,前段时间一直忙在项目上,再加上搭了个网站,你要说有事儿吧,其实事儿也不多。你要说没事儿吧,我就是不更。原因其实很简单,我懒!

可直接跳过目录一,直至目录二:征集书名

目录标题


先说说我那个项目吧!

一、嘻哩嘻哩网站

名字暂定于嘻哩嘻哩,主要类似于一个二次元的图漫交流网站。


1、技术栈

前端:vue2+antd for v2+vue-lazyload+vue-photo-preview+animate.css+AES/DES…;
后端:Express+MongoDB+jsonwebtoken+express-jwt+AES/DES…;

2、项目说明


web-view:前台项目
web-admin:后台管理系统
server:后端服务项目

vue/cli版本 :@4.0以上
node版本 : @14.3以上
MongoDB版本 :@4.0以上

3、web-view

略…前端没什么要说的…我把封装的几个工具贴出来吧

3.1 上传文件

upload.js

import axios from 'axios'
import { message } from 'ant-design-vue'

//  * 封装上传文件的post方法
//  * @param url
//  * @param data
//  * @returns {Promise}

// 接口域名地址
let baseURL = process.env.VUE_APP_API_BASE_URL


export function uploads(url, file) {
    return uploadData(url, file)
}


function uploadData(url, file) {
    // 创建 FormData 对象
    let formData = new FormData();
    // 通过 append() 方法来追加数据
    formData.append("files", file)
    return new Promise((resolve, reject) => {
        axios.post(baseURL + url, formData, {
            headers: {
                'Content-Type': 'multipart/form-data',
                'authorization': 'Bearer ' + localStorage.getItem('token'),
            }
        }).then(response => {
            resolve(response)
        }).catch(error => {
            if (error.response) {
                // 对响应错误做点什么
                switch (error.response.status) {
                    case 403:
                        message.error('拒绝访问')
                        break
                    case 500:
                        message.error('很抱歉,登录已过期,请重新登录')
                        localStorage.clear();
                        sessionStorage.clear()
                        setTimeout(() => {
                            window.location.reload()
                        }, 1000)
                        break
                    case 404:
                        message.error('很抱歉,资源未找到!')
                        break
                    case 405:
                        message.error('请求方式错误!')
                        break
                    case 504:
                        message.error('网络超时')
                        break
                    case 401:
                        message.error('未授权,请重新登录')
                        localStorage.clear();
                        sessionStorage.clear()
                        setTimeout(() => {
                            window.location.reload()
                        }, 1000)
                        break
                    default:
                        message.error(data.message)
                        break
                }
            }
            reject(error)
        })
    })
}

调用

import { uploads } from "@/utils/upload";

uploads("/dynamic/uploads", upload.file).then((res) => {
        if (res.data.code == 200) {

        } else {

        }
});
3.2 加解密

该方法主要用于登录密码等加密
idnumberDes.js

import CryptoJS from "crypto-js";

// des加密,isHex表示结果是否有密文,输出hex,否则输出base64

// key为加密的秘钥。message 为需要加密的信息
let encryptByDES = function (message, key, isHex = true) {
    var keyHex = CryptoJS.enc.Utf8.parse(key);
    var encrypted = CryptoJS.DES.encrypt(message, keyHex, {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    });
    if (isHex) return encrypted.ciphertext.toString();
    else return encrypted.toString();
}

// DES 解密,isHex表示对hex解密,否则对base64解密
let decryptByDES = (ciphertext, key, isHex = true) => {
    var keyHex = CryptoJS.enc.Utf8.parse(key);
    if (isHex) ciphertext = CryptoJS.enc.Hex.parse(ciphertext)
    else ciphertext = CryptoJS.enc.Base64.parse(ciphertext)
    var decrypted = CryptoJS.DES.decrypt({ ciphertext }, keyHex, {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    });
    return decrypted.toString(CryptoJS.enc.Utf8);
}

export {
    encryptByDES, decryptByDES
}

调用

import { encryptByDES } from "@/utils/idnumberDes";

encryptByDES(password,key)
// password 密码  key 需要与后端定义一致,此key值不可泄露
3.3 时间转换

把时间转为 n分钟前 n小时前 n天前…
timeago.js


//dateTimeStamp是一个时间毫秒,注意时间戳是秒的形式,在这个毫秒的基础上除以1000,就是十位数的时间戳。13位数的都是时间毫秒。

export function timeago(dateTimeStamp) {
    let dateStamp = new Date(dateTimeStamp)
    var minute = 1000 * 60;      //把分,时,天,周,半个月,一个月用毫秒表示
    var hour = minute * 60;
    var day = hour * 24;
    var week = day * 7;
    var halfamonth = day * 15;
    var month = day * 30;
    var now = new Date().getTime();   //获取当前时间毫秒

    var diffValue = now - dateStamp;//时间差

    if (diffValue < 0) {
        return;
    }
    let result = ""
    var minC = diffValue / minute;  //计算时间差的分,时,天,周,月
    var hourC = diffValue / hour;
    var dayC = diffValue / day;
    var weekC = diffValue / week;
    var monthC = diffValue / month;
    if (monthC >= 1 && monthC <= 3) {
        result = " " + parseInt(monthC) + "月前"
    } else if (weekC >= 1 && weekC <= 3) {
        result = " " + parseInt(weekC) + "周前"
    } else if (dayC >= 1 && dayC <= 6) {
        result = " " + parseInt(dayC) + "天前"
    } else if (hourC >= 1 && hourC <= 23) {
        result = " " + parseInt(hourC) + "小时前"
    } else if (minC >= 1 && minC <= 59) {
        result = " " + parseInt(minC) + "分钟前"
    } else if (diffValue >= 0 && diffValue <= minute) {
        result = "刚刚"
    } else {
        var datetime = new Date();
        datetime.setTime(dateStamp);
        var Nyear = datetime.getFullYear();
        var Nmonth = datetime.getMonth() + 1 < 10 ? "0" + (datetime.getMonth() + 1) : datetime.getMonth() + 1;
        var Ndate = datetime.getDate() < 10 ? "0" + datetime.getDate() : datetime.getDate();
        var Nhour = datetime.getHours() < 10 ? "0" + datetime.getHours() : datetime.getHours();
        var Nminute = datetime.getMinutes() < 10 ? "0" + datetime.getMinutes() : datetime.getMinutes();
        var Nsecond = datetime.getSeconds() < 10 ? "0" + datetime.getSeconds() : datetime.getSeconds();
        result = Nyear + "-" + Nmonth + "-" + Ndate
    }
    return result;
}

调用

import { timeago } from "@/utils/timeago";

getTime(time) {
      return timeago(time);
},

4、server

连接数据库我就不说了…


创建模型,定义表集合
例:用户表

4.1 注册登录


我就直接贴代码截图了

用户注册

用户登录

4.2 token验证

关于token验证,我有篇文章有写,在这不想过多的说
链接: vue+express生成token


包括一些不需要经过token验证的接口,以及错误处理,看那个文章吧!

4.3 首页上传图片及查询

上传图片

图片查询

4.4 数据库

目前数据库中有9张表:用户表、轮播图表、搜索表、图片分类表、首页图片表、发布动态表、消息通知表、申请管理表、审核权限表

后台管理系统我就不说了,都知道干啥用的。。。。

目前已完善功能:

✅ 登录/注册
✅ 图片分类、图片上传及下载、图片违规审核
✅ 发布动态(类似朋友圈)
✅ 评论、点赞
✅ 搜索内容、热门搜索
✅ 消息通知及推送
✅ 修改资料
✅ 分页查询
✅ 申请管理员

目前已知问题:

✅ 缺少修改密码功能
✅ 缺少短信验证
✅ 首页上传图片只能上传单图(发布动态可多图)
✅ 部分样式错误
✅ ios设备 时间显示NAN

总结

服务器:百度云 反向代理:nginx
目前网站域名等正在备案审核中 地址暂时为: 嘻哩嘻哩 - X站 - 年轻人都在玩的图漫社区

有问题也可以提出(有偿): 产品建议与问题反馈

有什么好的产品建议或者功能可以在上面链接中提出,后续可能考虑开源,供学习!因为是自己的网站,所以前后端都是随便写,好多代码都没有规范,主要嫌麻烦!看还是能看懂的,别担心,现在屎山不多。。。。扯多了,今天的主要任务是给书命名!!!本来打算写摸鱼日常(17)的,我想了又想,不算摸鱼,那就叫他(16.5)吧。。。。

二、征集书名

在去年的四月,出版社的老师找到我说我博客质量不错,有没有兴趣出书。我收到这个消息的时候内心是忐忑的,我没有写过书,也没有出过书,我不知道从何下手。

写书是一个漫长的过程,费时费力费心,我不知道能不能坚持下去,也不知道能不能写一本值得学习值得看的书。我本身就觉得自己知识储备不够,怎么能够传递知识??会不会在误人子弟??

但我还想试一下…

试过才有结果才知对错,不试永远没有结果,永远不知对错与否…


此书暂时命名为《菜鸟轻松拿Offer:前端工程师面试秘笈》。由我与另一位好基友张老师共同编写:张子豪/江子辰

其主要内容为前端主流技术的使用以及我们本人在使用中的心得体会,其中涉及框架的利与弊,在什么样的场景使用什么样的技术,是否符合市场需求,开发成本大不大,是否有利于维护,在对web安全方面有没有一个好的解决方案,包括现今各大企业涉及到的技术八股文,算法题等…

目前编写技术含:

html/css/JavaScript
TypeScript
ECMAScript
jQuery
node/node服务框架
vue(2/3)
react(15-18)
动画/3D
小程序/uniapp
混合开发/跨平台技术
网络相关
性能优化
操作系统
服务端渲染
浏览器/构建管理/类库工具

编写一年,差不多十之八九,本来预计的是今年3月完结,但是感觉技术覆盖率有点小,然后我跟张老师商量了一下,加了不少!希望能够帮助更多的人学习技术进大厂吧!!这是我们的初衷!!!内容有点多,可能很多地方不太精,嗯,到时候再说吧,只是时间问题!!1

废话不多说了。。

现在主要目的就是想征集一下书名,简洁大方,能够直观的突出书的本意,现在这个很low,还特别长!!

💗有偿:后续采用将给予200-500元红包鼓励!!我们也将会在此书发版之前,将样版赠送给你!!!💗

补:后期会做活动,挑10位技术人才免费赠书!!!

我是江太公,山水有相逢

有关划水日常(16.5)关于出版图书有偿征集书名 ~的更多相关文章

  1. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  2. ruby-on-rails - 关于 Ruby 的一般问题 - 2

    我在我的rails应用程序中安装了来自github.com的acts_as_versioned插件,但有一段代码我不完全理解,我希望有人能帮我解决这个问题class_eval我知道block内的方法(或任何它是什么)被定义为类内的实例方法,但我在插件的任何地方都找不到定义为常量的CLASS_METHODS,而且我也不确定是什么here,并且有问题的代码从lib/acts_as_versioned.rb的第199行开始。如果有人愿意告诉我这里的内幕,我将不胜感激。谢谢-C 最佳答案 这是一个异端。http://en.wikipedia

  3. ruby - 我怎样才能更好地了解/了解更多关于 Ruby 的知识? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?

  4. ruby - 关于 Ruby 中 Dir[] 和 File.join() 的混淆 - 2

    我在Ruby中遇到了一个关于Dir[]和File.join()的简单程序,blobs_dir='/path/to/dir'Dir[File.join(blobs_dir,"**","*")].eachdo|file|FileUtils.rm_rf(file)ifFile.symlink?(file)我有两个困惑:首先,File.join(@blobs_dir,"**","*")中的第二个和第三个参数是什么意思?其次,Dir[]在Ruby中有什么用?我只知道它等价于Dir.glob(),但是,我对Dir.glob()确实不是很清楚。 最佳答案

  5. 深度学习12. CNN经典网络 VGG16 - 2

    深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG

  6. elasticsearch源码关于TransportSearchAction【阶段三】 - 2

    1.回顾.TransportServicepublicclassTransportServiceextendsAbstractLifecycleComponentTransportService:方法:1publicfinalTextendsTransportResponse>voidsendRequest(finalTransport.Connectionconnection,finalStringaction,finalTransportRequestrequest,finalTransportRequestOptionsoptions,TransportResponseHandlerT>

  7. 关于Qt程序打包后运行库依赖的常见问题分析及解决方法 - 2

    目录一.大致如下常见问题:(1)找不到程序所依赖的Qt库version`Qt_5'notfound(requiredby(2)CouldnotLoadtheQtplatformplugin"xcb"in""eventhoughitwasfound(3)打包到在不同的linux系统下,或者打包到高版本的相同系统下,运行程序时,直接提示段错误即segmentationfault,或者Illegalinstruction(coredumped)非法指令(4)ldd应用程序或者库,查看运行所依赖的库时,直接报段错误二.问题逐个分析,得出解决方法:(1)找不到程序所依赖的Qt库version`Qt_5'

  8. 最新版人脸识别小程序 图片识别 生成二维码签到 地图上选点进行位置签到 计算签到距离 课程会议活动打卡日常考勤 上课签到打卡考勤口令签到 - 2

    技术选型1,前端小程序原生MINA框架cssJavaScriptWxml2,管理后台云开发Cms内容管理系统web网页3,数据后台小程序云开发云函数云开发数据库(基于MongoDB)云存储4,人脸识别算法基于百度智能云实现人脸识别一,用户端效果图预览老规矩我们先来看效果图,如果效果图符合你的需求,就继续往下看,如果不符合你的需求,可以跳过。1-1,登录注册页可以看到登录页有注册入口,注册页如下我们的注册,需要管理员审核,审核通过后才可以正常登录使用小程序1-2,个人中心页登录成功以后,我们会进入个人中心页我们在个人中心页可以注册人脸,因为我们做人脸识别签到,需要先注册人脸才可以进行人脸比对,进

  9. ruby - 关于 Ruby/ChefSpec 编码风格的反馈 - 2

    我是Ruby的新手,但过去两周我一直在对Chef测试进行大量研究。该测试使用ChefSpec和Fauxhai,但它看起来不是很“像ruby”,我希望社区能给我一些编码风格的建议。有没有更好的方法来编写这样的嵌套循环?Recipe/foo/recipes/default.rbpackage"foo"doaction:installendRecipe/foo/spec/default_spec.rbrequire'chefspec'describe'foo::default'doplatforms={"debian"=>['6.0.5'],"ubuntu"=>['12.04','10.04

  10. ruby - 关于 ruby​​ 类变量的困惑 - 2

    假设一个使用类变量的简单ruby​​程序,classHolder@@var=99defHolder.var=(val)@@var=valenddefvar@@varendend@@var="toplevelvariable"a=Holder.newputsa.var我猜结果应该是99,但输出不是99。我想知道为什么。由于类变量的范围是类,我假设@@var="toplevelvariable"行不会影响类中的变量。 最佳答案 @@var是Holder的类变量。而顶层的@@var不是Holder的同名类变量@@var,是你在创建类Obj

随机推荐