gxcuizy

gxcuizy 查看完整档案

北京编辑河池学院  |  网络工程 编辑中大联合  |  PHP开发工程师 编辑 www.y0701.com 编辑
编辑

我是如此的平凡,
却又如此的幸运。

个人动态

gxcuizy 发布了文章 · 7月8日

PHP算法:斐波那契数列的N种算法

前言

前段时间,遇到优化计算斐波那契数列的常规递归方法,但是一时间并没有及时想到很好的方法,所以后面查找了相关资料,总结了多种计算解法,所以分享出来,和大家一起交流学习。

斐波那契数是什么

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)。

知道了斐波那契数,那么下面我们就用多种不同的方法来计算获取第N位斐波那契数。

普通递归

这种方法是最常规的,直接根据定义F(n)=F(n - 1)+F(n - 2)递归计算即可,但是性能是最低的。

/**
 * 普通递归
 * @param int $n
 * @return int
 */
function fib($n = 1)
{
    // 低位处理
    if ($n < 3) {
        return 1;
    }
    // 递归计算前两位
    return fib($n - 1) + fib($n - 2);
}

递归优化

从上面的递归方法可以看到,进行了很多的重复计算,性能极差,如果N越大,计算的次数太可怕了,那么,既然因为重复计算影响了性能,那么优化就从减少重复计算入手,即把之前计算的存储起来,这样就避免了过多的重复计算,优化了递归算法。

/**
 * 递归优化
 * @param int $n
 * @param int $a
 * @param int $b
 * @return int
 */
function fib_2($n = 1, $a = 1, $b = 1)
{
    if ($n > 2) {
        // 存储前一位,优化递归计算
        return fib_2($n - 1, $a + $b, $a);
    }
    return $a;
}

记忆化自底向上

自底向上通过迭代计算斐波那契数的子问题并存储已计算的值,通过已计算的值进行计算。使用for循环,减少递归带来的重复计算问题。

/**
 * 记忆化自底向上
 * @param int $n
 * @return int
 */
function fib_3($n = 1)
{
    $list = [];
    for ($i = 0; $i <= $n; $i++) {
        // 从低到高位数,依次存入数组中
        if ($i < 2) {
            $list[] = $i;
        } else {
            $list[] = $list[$i - 1] + $list[$i - 2];
        }
    }
    // 返回最后一个数,即第N个数
    return $list[$n];
}

自底向上进行迭代

最低位初始化赋值,使用for从低位到高位迭代计算,从而得到第N个数。

/**
 * 自底向上进行迭代
 * @param int $n
 * @return int
 */
function fib_4($n = 1)
{
    // 低位处理
    if ($n <= 0) {
        return 0;
    }
    if ($n < 3) {
        return 1;
    }
    $a = 0;
    $b = 1;
    // 循环计算
    for ($i = 2; $i < $n; $i++) {
        $b = $a + $b;
        $a = $b - $a;
    }
    return $b;
}

公式法

通过了解斐波那契序列和黄金分割比之间的关系,使用黄金分割率计算第N个斐波那契数。

/**
 * 公式法
 * @param int $n
 * @return int
 */
function fib_5($n = 1)
{
    // 黄金分割比
    $radio = (1 + sqrt(5)) / 2;
    // 斐波那契序列和黄金分割比之间的关系计算
    $num = intval(round(pow($radio, $n) / sqrt(5)));
    return $num;
}

无敌欠揍法

这个方法,我就不多说了吧,大家都懂的,但是千万别轻易尝试……

/**
 * 无敌欠揍法
 * @param int $n
 * @return int
 */
function fib_6($n = 1)
{
    // 列举了30个数
    $list = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269];
    return $list[$n];
}

最后

好了,我就大概写了几种解法,如果有不对的地方,请大家指出,我会及时修改,大家有其他计算方法,欢迎分享出来一起交流和学习,谢谢!

查看原文

赞 0 收藏 0 评论 0

gxcuizy 发布了文章 · 6月24日

python分析BOSS直聘的某个岗位数据

前言

毕业找工作,在职人员换工作,离职人员找工作……不管什么人群,应聘求职,都需要先分析对应的岗位,岗位需求是否和自己匹配,常见的找工作平台有:BOSS直聘、拉钩、智联等,我们通常的方法都是,打开招聘网站,搜索职位关键字,然后一页一页的逐个查看,觉得还不错的岗位就投递一下简历,或者和负责人聊一下,那么有没有办法,能一次性把相关的招聘岗位列出来,方便快速的分析,答案当然有的……

我想做什么

最近我也在考虑新的工作机会,所以,为了方便才这么做的;下面给大家看个东西,打开后面的链接BOSS直聘的100个PHP招聘岗位

可以看到,这是表格的形式展示了100个PHP的招聘岗位,没错,这就是我爬取的BOSS直聘网的PHP招聘岗位,为啥是100个呢,我也不敢问啊,毕竟BOSS直聘官网限制了10页,通过爬取数据,然后生成markdown表格文件,最后展示在有道分享中,就是上面大家看到的那个了,话不多说,开搞。

运行环境

Python运行环境:Windows + python3.6
用到的模块:requests、bs4
如未安装的模块,请使用pip instatll xxxxxx进行安装,例如:pip install requests

爬取Boss直聘数据

在这里,非常不建议大家使用自己的IP去爬取BOSS直聘的数据,因为分分钟就会进小黑屋了,所以,这里,我们走的代理IP,关于代理IP的,我在上篇文章,已经有说到过,大家不明白的可以回头看看;还有在header头传的cookie值是必传的,大家可以在浏览器中刷新BOSS直聘网站,然后打开F12Network中找到,复制过来就能用,而且需要更换,不要一直用同个cookie去爬取全部数据,多尝试都懂的……

def get_url_html(self, url, cookie):
    """请求页面html"""
    ip_url = self.proxies_ip + ':' + str(self.proxies_port)
    proxies = {'http': 'http://' + ip_url, 'https': 'https://' + ip_url}
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
        'cookie': cookie
    }
    request = requests.get(url=url, headers=header, proxies=proxies, timeout=3)
    html = False
    if request.status_code == 200:
        html = request.content
    return html

完整源码

老规矩,代码我已经上传了GitHub(GitHub源码地址),但是呢,作为一个热心的搬瓦工,为了方便部分人想偷懒,不直接去交友网站查看,我在这里也贴一下源码出来吧,如果有啥问题,最好还是去交友网站找我,请接码……

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
利用requests+bs4爬取Boss直聘数据
author: gxcuizy
date: 2020-06-18
"""

import requests
from bs4 import BeautifulSoup


class GetBossData(object):
    """爬取10页的Boss直聘职位数据"""
    domain = 'https://www.zhipin.com'
    base_url = 'https://www.zhipin.com/c101280600/?query='
    position = ''
    # 代理IP地址
    proxies_ip = '58.220.95.30'
    proxies_port = '10174'

    def __init__(self, position):
        self.position = position

    def get_url_html(self, url, cookie):
        """请求页面html"""
        ip_url = self.proxies_ip + ':' + str(self.proxies_port)
        proxies = {'http': 'http://' + ip_url, 'https': 'https://' + ip_url}
        header = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
            'cookie': cookie
        }
        request = requests.get(url=url, headers=header, proxies=proxies, timeout=3)
        html = False
        if request.status_code == 200:
            html = request.content
        return html

    def run(self):
        """执行入口"""
        page_list = range(1, 11)
        # 打开文件,准备写入
        dict_file = open('job.md', 'a', encoding='UTF-8')
        # 清空文件内容
        dict_file.seek(0)
        dict_file.truncate()
        dict_file.write('| 岗位 | 区域 | 薪资 | 年限信息 | 公司名称 | 公司信息 | 链接 |')
        dict_file.write('\n| --- | --- | --- | --- | --- | --- | --- |')
        # 分页爬取数据
        for page in page_list:
            print('开始爬取第' + str(page) + '页数据')
            boss_url = self.base_url + str(self.position) + '&page=' + str(page) + '&ka=page-' + str(page)
            # F12打开调试模式,手动刷新网页获取cookie,然后替换
            if page < 4:
                cookie_val = 'lastCity=101280600; __zp_seo_uuid__=d59649f5-bc8a-4263-b4e1-d5fb1526ebbe; __c=1592469667; __g=-; Hm_lvt_194df3105ad7148dcf2b98a91b5e727a=1592469673; __l=l=%2Fwww.zhipin.com%2Fshenzhen%2F&r=https%3A%2F%2Fwww.google.com%2F&friend_source=0&friend_source=0; toUrl=https%3A%2F%2Fwww.zhipin.com%2F%2Fjob_detail%2F3f35305467e161991nJ429i4GA%7E%7E.html; __a=43955211.1592469667..1592469667.39.1.39.39; Hm_lpvt_194df3105ad7148dcf2b98a91b5e727a=1592530438; __zp_stoken__=7f3aaPCVBFktLe0xkP21%2BJSFCLWILSwx7NEw4bVJkRx8pdBE3JGNmWjVwdx5PXC8rHmN%2BJB0hX1UvTz5VPyMmOhIVHBglVzoxJQIdLQtKR3ZFBFIeazwOByVndHwXBAN%2FXFo7W2BffFxtXSU%3D; __zp_sseed__=Ykg0aQ3ow1dZqyi9KmeVnWrqZXcZ32a4psiagwqme3M=; __zp_sname__=93bf4835; __zp_sts__=1592530479301'
            elif page < 7:
                cookie_val = 'lastCity=101280600; __zp_seo_uuid__=d59649f5-bc8a-4263-b4e1-d5fb1526ebbe; __c=1592469667; __g=-; Hm_lvt_194df3105ad7148dcf2b98a91b5e727a=1592469673; __l=l=%2Fwww.zhipin.com%2Fshenzhen%2F&r=https%3A%2F%2Fwww.google.com%2F&friend_source=0&friend_source=0; toUrl=https%3A%2F%2Fwww.zhipin.com%2F%2Fjob_detail%2F3f35305467e161991nJ429i4GA%7E%7E.html; __a=43955211.1592469667..1592469667.39.1.39.39; Hm_lpvt_194df3105ad7148dcf2b98a91b5e727a=1592530438; __zp_stoken__=7f3aaPCVBFktLe0xkP21%2BJSFCLWILSwx7NEw4bVJkRx8pdBE3JGNmWjVwdx5PXC8rHmN%2BJB0hX1UvTz5VPyMmOhIVHBglVzoxJQIdLQtKR3ZFBFIeazwOByVndHwXBAN%2FXFo7W2BffFxtXSU%3D; __zp_sseed__=Ykg0aQ3ow1dZqyi9KmeVnWrqZXcZ32a4psiagwqme3M=; __zp_sname__=93bf4835; __zp_sts__=1592530514188'
            elif page < 10:
                cookie_val = 'lastCity=101280600; __zp_seo_uuid__=d59649f5-bc8a-4263-b4e1-d5fb1526ebbe; __c=1592469667; __g=-; Hm_lvt_194df3105ad7148dcf2b98a91b5e727a=1592469673; __l=l=%2Fwww.zhipin.com%2Fshenzhen%2F&r=https%3A%2F%2Fwww.google.com%2F&friend_source=0&friend_source=0; toUrl=https%3A%2F%2Fwww.zhipin.com%2F%2Fjob_detail%2F3f35305467e161991nJ429i4GA%7E%7E.html; __a=43955211.1592469667..1592469667.40.1.40.40; Hm_lpvt_194df3105ad7148dcf2b98a91b5e727a=1592530479; __zp_stoken__=7f3aaPCVBFktLCT4uVVV%2BJSFCLWIVPWZyNUk4bVJkR25XXHVeZWNmWjVwd286Sm83HmN%2BJB0hX1UvBiBVRyt9IWQOcRtWSk83fAsfJAtKR3ZFBE5efUl%2FByVndHwXRQN%2FXFo7W2BffFxtXSU%3D; __zp_sseed__=Ykg0aQ3ow1dZqyi9KmeVnd/9vyiSRHrJFoMai+azsb8=; __zp_sname__=93bf4835; __zp_sts__=1592530496863'
            else:
                cookie_val = 'lastCity=101280600; __zp_seo_uuid__=d59649f5-bc8a-4263-b4e1-d5fb1526ebbe; __c=1592469667; __g=-; Hm_lvt_194df3105ad7148dcf2b98a91b5e727a=1592469673; __l=l=%2Fwww.zhipin.com%2Fshenzhen%2F&r=https%3A%2F%2Fwww.google.com%2F&friend_source=0&friend_source=0; toUrl=https%3A%2F%2Fwww.zhipin.com%2F%2Fjob_detail%2F3f35305467e161991nJ429i4GA%7E%7E.html; __a=43955211.1592469667..1592469667.41.1.41.41; __zp_stoken__=7f3aaPCVBFktLc1t4VTp%2BJSFCLWJscnlxSgw4bVJkRw9tLB4pb2NmWjVwdwwgc2l7HmN%2BJB0hX1UvGFZVTH0OdhQQfwxfOyoieW8cOgtKR3ZFBAJYRFMcByVndHwXTwN%2FXFo7W2BffFxtXSU%3D; Hm_lpvt_194df3105ad7148dcf2b98a91b5e727a=1592530497; __zp_sseed__=Ykg0aQ3ow1dZqyi9KmeVnSZKsrhFUU/CYntJcRoFki4=; __zp_sname__=93bf4835; __zp_sts__=1592530514188'
            html = self.get_url_html(boss_url, cookie_val)
            soup = BeautifulSoup(html, 'html.parser')
            # 招聘职位列表
            job_list = soup.select('.job-list ul li')
            for job_li in job_list:
                # 单条职位信息
                url = self.domain + job_li.select('.job-title a')[0].attrs['href']
                title = job_li.select('.job-title a')[0].get_text()
                area = job_li.select('.job-title .job-area')[0].get_text()
                salary = job_li.select('.job-limit .red')[0].get_text()
                year = job_li.select('.job-limit p')[0].get_text()
                company = job_li.select('.info-company h3')[0].get_text()
                industry = job_li.select('.info-company p')[0].get_text()
                info = {
                    'title': title,
                    'area': area,
                    'salary': salary,
                    'year': year,
                    'company': company,
                    'industry': industry,
                    'url': url
                }
                print(info)
                # 写入职位信息
                info_demo = '\n| %s | %s | %s | %s | %s | %s | %s |'
                dict_file.write(info_demo % (title, area, salary, year, company, industry, url))
        dict_file.close()


# 程序主入口
if __name__ == '__main__':
    # 实例化
    job_name = input('请输入职位关键字:').strip()
    if job_name == '':
        print('关键字为空,请重新尝试')
        exit(0)
    gl = GetBossData(job_name)
    # 执行脚本
    gl.run()

最后

如果大家有任何问题,都可以留言给我,大家相互学习……

希望所有正在找工作的小伙伴们都能马上收到满意的Offer,多薪少活那种!

哦对了,在线求职,本人在深圳拍(P)簧(H)片(P),如果大家觉得有适合我的工作,可以推荐给我的,不胜感谢。

查看原文

赞 0 收藏 0 评论 0

gxcuizy 赞了文章 · 6月23日

你不知道的几个牛逼网站,欢迎收藏

自己收藏的几个好玩牛逼的网站

1、搜源码-方便找到你想要的一些源码,例如一些插件的js,免得去一些博客花钱去下载了

链接: http://www.bvbcode.com/cn/.

2、在线P图,不用下载或者等待photoshop打开,很爽的一个网站

链接: https://www.uupoop.com/ps/.

3、最全的jquery源码插件大全

链接: http://www.jq22.com.

4、在线的postwoman,测试接口方便至极

链接: https://postwoman.io/.

5、几个可以免费下载网站源码模板的网站

链接: http://www.bootstrapmb.com/.
链接: https://www.lanrenzhijia.com/.
链接: http://www.dedecms.com/.
链接: https://mb.yangqq.com/.(部分免费)

6、几个可以接收短信验证码的网站,可以手机号注册一些网站账号…

链接: http://www.z-sms.com/.
链接: https://www.materialtools.com/.
链接: http://www.xnsms.com/.
链接: http://www.kakasms.com/.
链接: https://www.bfkdim.com/.

7、可以创建虚拟邮箱的网站,可以接收一些不重要的邮件或者用邮箱注册账号…

链接: http://www.5-mail.com/.

8、矢量图标-icon的网站,还是比较全的

链接: https://www.iconfont.cn/.

9、在线JSON 转换 Excel的网站,不用写脚本,直接导出就OK了

链接: http://j2e.kpoda.com/.

10、免费在线word、excel、图片和PDF之间互相转换及处理

链接: http://www.pdfdo.com/.
链接: https://app.xunjiepdf.com/.
链接: https://smallpdf.com/.

11、在线免费下载付费音乐。

链接: http://music.ifkdy.com/.

12、在线压缩图片,不失帧,压缩率平均达80%左右,很牛逼的一个网站

链接: https://tinypng.com/.

13、8个免费高清无版权图片网站!–收藏必备

Pexels: https://www.pexels.com/.
Stock up: https://www.sitebuilderreport.com/stock-up.
别样网: https://www.ssyer.com/.
Unsplash: https://unsplash.com/.
Pixabay: https://pixabay.com/.
StockSnap: https://stocksnap.io/.
Magdeleine: https://magdeleine.co/.
VisualHunt: https://visualhunt.com/.

14、GIF动图,比较流畅功能比较全的几个网站,斗图必备

链接: https://www.soogif.com/.
链接: https://biaoqingsoso.com/.

后续如果有新发现,会持续更新!

查看原文

赞 105 收藏 84 评论 2

gxcuizy 发布了文章 · 6月22日

python爬取高匿代理IP(再也不用担心会进小黑屋了)

为什么要用代理IP

很多数据网站,对于反爬虫都做了一定的限制,这个如果写过一些爬虫程序的小伙伴应该都深有体会,其实主要还是IP进了小黑屋了,那么为了安全,就不能使用自己的实际IP去爬取人家网站了,这个时候,就需要采用代理IP去做这些事情……

为什么要用高匿代理

我们可以对比不同类型的代理的区别,根据代理的匿名程度,代理可以分为如下类别:

  • 高度匿名代理:会将数据包原封不动的转发,在服务端看来就好像真的是一个普通客户端在访问,而记录的IP则是代理服务器的IP。
  • 普通匿名代理:会在数据包上做一些改动,服务器上有可能发现这是个代理服务器,也有一定几率追查到客户端的真实IP。
  • 透明代理:不但改动了数据包,还会告诉服务器客户端的真实IP。
  • 间谍代理:指组织或个人创建的用户记录用户传输的数据,然后进行研究、监控等目的的代理服务器。

运行环境

Python运行环境:Windows + python3.6
用到的模块:requests、bs4、json
如未安装的模块,请使用pip instatll xxxxxx进行安装,例如:pip install requests

爬取西刺代理IP

这里,我只大概爬取西刺高匿代理50页的数据,当然了,爬100页,爬全部,都是可以的,就不多说了;

def run(self):
    """执行入口"""
    page_list = range(1, 51)
    with open("ip.json", "w") as write_file:
        for page in page_list:
            # 分页爬取数据
            print('开始爬取第' + str(page) + '页IP数据')
            ip_url = self.base_url + str(page)
            html = self.get_url_html(ip_url)
            soup = BeautifulSoup(html, 'html.parser')
            # IP列表
            ip_list = soup.select('#ip_list .odd')
            for ip_tr in ip_list:
                # 单条Ip信息
                td_list = ip_tr.select('td')
                ip_address = td_list[1].get_text()
                ip_port = td_list[2].get_text()
                ip_type = td_list[5].get_text()
                info = {'ip': ip_address, 'port': ip_port, 'type': ip_type}
                # 先校验一下IP的有效性再存储
                check_res = self.check_ip(info)
                if check_res:
                    print('IP有效:', info)
                    self.json_data.append(info)
                else:
                    print('IP无效:', info)
        json.dump(self.json_data, write_file)

检测代理IP是否有效

爬取到的代理IP可能不能用,为了方便使用的时候,不报太多异常错误,所以需要先检测一下IP是否能正常使用,是否是有效代理IP,我这里列了三个网站,都可以很方便的检测IP地址是否能有效使用

def check_ip(self, ip_info):
    """测试IP地址是否有效"""
    ip_url = ip_info['ip'] + ':' + str(ip_info['port'])
    proxies = {'http': 'http://' + ip_url, 'https': 'https://' + ip_url}
    res = False
    try:
        request = requests.get(url=self.check_url, headers=self.header, proxies=proxies, timeout=3)
        if request.status_code == 200:
            res = True
    except Exception as error_info:
        res = False
    return res

存储代理IP

我这里就不搞那些花里胡哨的,我直接把所有有效的代理IP的json格式的数据存储到文件中,当然了,也可以存储到MongoDB或者MySQL数据库中,不管怎样存储,在使用的时候都是随机选取一个IP,更加方便快捷。

完整代码

代码我已经上传了GitHub(GitHub源码地址),但是呢,作为一个热心的搬瓦工,为了方便部分人想偷懒,不直接去交友网站查看,我在这里也贴一下源码出来吧,如果有啥问题,最好还是去交友网站找我,请接码……

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
利用requests+bs4爬取国内高匿代理IP
author: gxcuizy
date: 2020-06-19
"""

import requests
from bs4 import BeautifulSoup
import json


class GetIpData(object):
    """爬取50页国内高匿代理IP"""
    header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36'}
    base_url = 'https://www.xicidaili.com/nn/'
    check_url = 'https://www.ip.cn/'
    json_data = []

    def get_url_html(self, url):
        """请求页面html"""
        request = requests.get(url=url, headers=self.header, timeout=5)
        html = False
        if request.status_code == 200:
            html = request.content
        return html

    def check_ip(self, ip_info):
        """测试IP地址是否有效"""
        ip_url = ip_info['ip'] + ':' + str(ip_info['port'])
        proxies = {'http': 'http://' + ip_url, 'https': 'https://' + ip_url}
        res = False
        try:
            request = requests.get(url=self.check_url, headers=self.header, proxies=proxies, timeout=3)
            if request.status_code == 200:
                res = True
        except Exception as error_info:
            res = False
        return res

    def run(self):
        """执行入口"""
        page_list = range(1, 51)
        with open("ip.json", "w") as write_file:
            for page in page_list:
                # 分页爬取数据
                print('开始爬取第' + str(page) + '页IP数据')
                ip_url = self.base_url + str(page)
                html = self.get_url_html(ip_url)
                soup = BeautifulSoup(html, 'html.parser')
                # IP列表
                ip_list = soup.select('#ip_list .odd')
                for ip_tr in ip_list:
                    # 单条Ip信息
                    td_list = ip_tr.select('td')
                    ip_address = td_list[1].get_text()
                    ip_port = td_list[2].get_text()
                    ip_type = td_list[5].get_text()
                    info = {'ip': ip_address, 'port': ip_port, 'type': ip_type}
                    # 先校验一下IP的有效性再存储
                    check_res = self.check_ip(info)
                    if check_res:
                        print('IP有效:', info)
                        self.json_data.append(info)
                    else:
                        print('IP无效:', info)
            json.dump(self.json_data, write_file)


# 程序主入口
if __name__ == '__main__':
    # 实例化
    ip = GetIpData()
    # 执行脚本
    ip.run()

最后

老规矩,大家有任何问题,都可以留言或者各种渠道告诉我,大家可以相互学习和交流,共同成长……

查看原文

赞 1 收藏 1 评论 0

gxcuizy 发布了文章 · 6月16日

抽签决定,再也不用担心吃什么了

前言

早上起床,问自己:早餐吃啥?

十一点,到点外卖的时间,问自己:午餐吃啥?

五点快下班了,回家做饭,问自己:晚餐炒什么菜?

晚上十点半,消化差不多又饿了,问自己:夜宵吃啥?

很多时候,一到饭点,我们都开始纠结吃啥,并且从来都没有得到解决,令人头大……

为了帮助大家解决这种选择困难症,我突发奇想搞了个抽签程序,也就是,不知道吃啥,那就抽签决定呗!

项目体验

访问地址:http://food.y0701.com/

项目共要分为三个页面,分页为:1首页抽签、2菜谱列表、3新增菜谱

  • 首页抽签页面

首页右侧是随机出现的三个菜谱,核心功能在左侧,左侧功能可以随机抽取指定条件数量的菜谱,并且可以更换抽签的任意一个结果。

  • 菜谱列表页面

菜谱列表中,默认展示最多12个菜谱,支持分页查看,以及根据菜谱名称关键字和类型筛选。

  • 新增菜谱

我只是列了部分我常做和吃的菜,为了方便更多的人使用,可以进行新增菜谱的操作,更加方便和快捷。

功能实现

为了方便,前端布局我采用的是Bootstrap,能够自适应手机端和电脑端的布局,并且用到了Layer.js优化弹框提示,后端采用的是ThinkPHP5框架进行开发,对了,数据存储在MySQL中,而且数据表我也导出并存放在项目根目录下的public/t_food.sql中,可以直接导入执行就用。

完整源码

为了方便大家查看,我已经把全部代码都上传到了GitHub中,欢迎大家PR更多好玩的代码

GitHub项目地址:https://github.com/gxcuizy/what-eat-today

最后

大家有任何问题,都可以给我留言给我,我会及时修改,如有说的不对的地方,还请大家帮忙纠正。对了,前端页面我写的比较拼凑,专业人员不要找我麻烦哈……

查看原文

赞 0 收藏 0 评论 0

gxcuizy 回答了问题 · 6月9日

pc端从网上找了段a标签链接的方式跳转到阿里旺旺(千牛),但是移动端无效

通过请求Scheme协议,可以判断本地是否安装了该应用,安装的话直接调起应用;
如果没安装,那么再做跳转到网页端的处理

关注 3 回答 1

gxcuizy 回答了问题 · 6月9日

mysql中 建立一个用户表,一个订单表。将用户表中的uid,uname设为主键,订单表中的uid,uname怎么同时和主表关联

所有的表都一样的,设一个主键就行了

你这里的用户和订单的绑定关系,其实只需要在订单中存用户的uid就行了,用户和订单都通过uid来关联,uname不要冗余存,没用的,因为uname是随时可变的,而用户表的uid则是不会改变的字段值

关注 3 回答 2

gxcuizy 赞了回答 · 6月9日

mysql没没有声明主键会自动选择一列不重复的作为聚集索引,怎么找到它默认生成的是哪一列?

If you do not define a PRIMARY KEY for your table, MySQL picks the first UNIQUE index that has only NOT NULL columns as the primary key and InnoDB uses it as the clustered index. If there is no such index in the table, InnoDB internally generates a clustered index where the rows are ordered by the row ID that InnoDB assigns to the rows in such a table. The row ID is a 6-byte field that increases monotonically as new rows are inserted. Thus, the rows ordered by the row ID are physically in insertion order.

关注 2 回答 1

gxcuizy 回答了问题 · 6月9日

MySQL 事务中发生错误,事务真的会回滚吗

你这里开启了一个事物,并不是发生异常的时候就回滚的,

而你下面直接commit提交了事物,那么成功执行语句就会成功了;

如果你不执行提交事物的话,在当前连接关闭后,事物才会自动回滚。

关注 3 回答 2

gxcuizy 回答了问题 · 6月9日

通过微信二维码,打开一个h5页面,h5页面要怎么做?

是做响应式页面还是单独的H5页面,得根据当前的业务场景以及现有基础架构来定的啊,比如:

  • 你要做一个招商广告业,没有任何功能交互,那写一个H5静态页
  • 如果你分享的是一个商品,需要让用户登录下单购买啥的,那就不是一个简单的了,得整套流程支持
  • 如果你是一个APP的下载引流页,那么得做好手机端的各种适配和识别
  • 等等……

关注 7 回答 6

gxcuizy 回答了问题 · 6月9日

解决Laravel 中遇到一个 toarray 问题,是框架原因吗??

你看一下你的Order模型,是不是有对这个字段做了转换处理呢

关注 4 回答 3

gxcuizy 回答了问题 · 6月9日

后台管理系统界面卡顿,需要刷新整个界面才能正常加载

打开F12Network看看请求吧,是不是有什么请求超时了,或者报错了啥的

关注 7 回答 8

gxcuizy 回答了问题 · 6月5日

php js 跳转的问题

直接把$obj['type_id']传到里面就行了

<script>
window.location.href="/index.php/vodshow/<?php echo $obj['type_id']; ?>.html"
</script>

关注 4 回答 3

gxcuizy 赞了回答 · 6月5日

解决MySQL与SQLServer性能对比

根据IJARCCE(国际计算机与通信工程高级研究杂志)发表于2015年3月的一篇论文,可以看到单纯从性能方面看,Mysql与SQL Server还是有不小差距的,除了在执行INSERT语句时Mysql略快之外,其它各种语句Mysql性能都无法与SQL Server相比。

无条件的SELECT语句

1.Averages for a non-conditional SELECT query1

带排序的SELECT语句

2.Averages for SELECT query having an ORDER clause on a non-indexed field

带JOIN的SELECT语句

3.Averages for SELECT query with a JOIN1

执行100条INSERT语句

5.Averages for 100 INSERT queries

带条件的DELETE语句

6.Averages for conditional DELETE query

无条件的DELETE语句

7.Averages for non-conditional DELETE query

带条件的UPDATE语句

8.Averages for conditional UPDATE query

无条件的UPDATE语句

9.Averages for non-conditional UPDATE query

PS. 我不明白为什么会有人给这样的问题扣分,如果你不懂,就承认不懂,没有必要鄙视提出问题的人。

关注 3 回答 1

gxcuizy 发布了文章 · 6月5日

北漂之鬼知道我经历了什么

前言

之前的文章【北漂之毕业裁员后的又一波奇遇】说到,我们毕业后经历了一个“见光死”(一上线就团队解散)的项目,为了赶项目那期间,我们几个人都是加班加点的进行开发,虽然中间需求修改了几次,但是我们仍然快速的进行开发调整,并达到了上线要求,并且最终也提前上线了,在上线那天晚上,老板还规划着上线后,为了犒劳大家这段时间的辛苦付出,团队周末一起出去团建,谁能想到,项目刚一上线,由于效果并不太理想,技术团队也被迫全部解散了……

国庆后积极面试

由于刚毕业没多久,也没太多经验,过完国庆后,就在BOSS直聘拉钩网以及智联招聘上面投递简历,并陆续收到一些面试邀请,经过大概一个周左右的面试,也收到了两三个Offer,我记得有一个是用ShopNC二次开发做多店铺商城开发的,这个和我实习的公司项目差不多,而且公司规模比较小,我给拒了;还有一个是做什么的我忘了,而最后的一个是做教育类的,而且面试的时候说要重构这个项目,所以,我想着去这里应该能学到不少东西,所以最终选择去了这里,并即将开始新的工作环境。

刚去公司的工作内容

和所有的开发小哥哥小姐姐一样,入职后都是先分配电脑并安装自己开发常用软件和搭建本地开发环境等,然后就是介绍认识团队的人,客套完毕后,就是找相关负责人拿到公司代码相关权限账号等,了解业务和相关代码实现和逻辑规范;

可能有人会问,不是说入职要重构吗?怎么还会了解以前的代码呢,因为需要重构的代码以前是Java语言开发的,需要和他们进行一个交接,也就是了解相关业务和功能,包括一些隐藏的细节,因为重构前做的准备越多,后面的工作进行麻烦就会越少。

负责重构项目

刚去公司不久,技术部的总监就找到了我,说让我负责整个重构的项目,说实在的,我的第一反应是拒绝的,因为我想着自己也没多少经验,更没有管理经验了,所以一开始确实有点怂,但还是硬着头皮上了。

因为之前已经把大概的需求和业务了解了,然后现在就开始项目框架选型以及数据库数据表的重新梳理和优化,以及制定了一些新项目的代码编写规范等(我也没啥经验,但是想着如果能统一规范,也方便后期的代码维护和管理的成本,也不至于被后面接手项目的人骂)……

项目框架选型方面,当时公司内有一个旧项目,使用Yii2框架开发的,但是团队的其他人并不是太熟这个框架,学习成本和后期开发进度和代码质量可能会有问题,然后再对比ThinkPHP5Laravel5,并最终决定PHP框架采用ThinkPHP5,然后是MVC的开发模式,数据库毫无疑问的是用的MySQL,而前端方面,主要还是采用jQuery + Ajax,并没有用其他类似AngularJs或者VUE等,主要还是考虑到团队的技术栈问题。

基本框架选定之后,我自己先把项目的基础给搭建起来,然后再分配功能模块给组内其他人进行开发,而我就又先去整理数据表,完善全部表的注释以及相关优化,花了几天优化表完成后,又找其他人讨论了历史数据的清洗问题,因为重构项目上线后,以前的数据还得还原,所以,经过大家一番讨论,有的简单的可以直接通过编写SQL语句即可,而有些复杂的数据则需要编写脚本程序去执行清洗(大家在任何需求开发过程中,如果涉及到历史数据的,应该也要考虑一下数据清洗的问题),这些都花了不少时间,处理完数据表后,我也投入到相关功能模块的开发中,大家一起努力,项目也顺利的上线了,上线后,也没有太大的问题,而我们也继续进行功能完善和迭代开发……

春节后的怪事

我们年前已经把项目基本写完了,大家也都回家过年和家人团聚了,年后,回到公司的时候,执行拉取项目的时候,有的地方执行报异常,原来有人在春节期间改动了很多代码,一看,全是一个人(我们技术部团队的负责人,我们叫他“高哥”)改动的,把我们之前写的一些功能代码,都给改了,虽然不影响功能,但是有的写法也给重写了,感觉有点吓人,我们都闹不明白,一声不说为啥要改我们的代码,为了这件事,我们还和他理论了好一会,确实不应该这么干的。

个人原因离职

大概2月底的时候,技术部负责人找到我,说要精简技术部人员,然后说我们PHP组内要裁掉某一个人,我当时是想着我们这项目不是刚重构上线没多久,怎么就现在就要精简技术部了呢,有点让心心凉,毕竟曾经一个战壕奋斗的兄弟……

中间也发生了一些其他事情,就不细说了,大概三月份,因为一些“个人原因”,我也向公司提了离职申请,并开始了交接工作,刚到这公司不到半年,就又要再次踏上找工作之路,生活不易啊。

最后

16年毕业,还不到一年,就被迫换了两家公司,真的是年少不懂事啊,后面新工作的选择,稳定性肯定会要考虑到的,所以后面的公司也还算稳定,因为在那工作了两年吧,不能说太多了,预知后事如何,且听下回分解……

查看原文

赞 0 收藏 0 评论 0

gxcuizy 回答了问题 · 6月5日

mysql查询排序

哪有这种排序的,做不到的,除非你把全部数据给查出来,然后循环全部数据去处理。

关注 5 回答 4

gxcuizy 回答了问题 · 6月4日

解决多条数据叫"数据集",单条数据叫什么比较好?

那就叫:数据行……

关注 6 回答 5

gxcuizy 回答了问题 · 6月4日

解决未登录时,思否的个人设置页面,登录后是如何返回个人设置页面的?

这个一般是服务器端做的处理,与前端无关;
在PC网页中,当用户登陆后,会把用户的信息存入Session或者Redis中,也有存Cookie的。
当访问用户个人页面的时候,服务器端会先校验用户是否登录,如果未登录,那么会自动跳转到登录页面,登录完成后,又跳转到刚才的地址。

关注 2 回答 2

gxcuizy 回答了问题 · 6月4日

解决请教sql多表联查的问题

SELECT
    g.gid,
    g.title,
    g.price,
    u.nickname,
    u.avatarUrl,
    b.price bids_price 
FROM
    goods g
    LEFT JOIN bids b ON g.gid = b.gid AND b.STATUS = 1
    LEFT JOIN users u ON b.uid = u.uid 
  ORDER BYb.STATUS DESC;

你试试这个,是不是你想要的

关注 3 回答 2

gxcuizy 回答了问题 · 6月4日

MySQL无主键左关联查询时无法返回正确结果吗?

微信截图_20200604112801.png

你看这个数据,我造了你的数据去执行,结果怎么和你的不一样呢,没问题啊,估计是你本地数据的问题了,你查一下你本地的数据,SQL语法是没问题的。

关注 4 回答 3