精华内容
下载资源
问答
  • python后端面试题

    2018-06-04 15:58:01
    1. *args, **kwargs是什么意思 2.谈一谈python中的装饰器 3.python的垃圾回收机制以及内存管理 4.Python多线程(multi-threading)。这是个好主意吗? 5.说明os,sys模块不同,并列举常用的模块方法 6.什么是lambda...
  • Python相关1.*args, **kwargs是什么意思?*args: 可变位置参数。*kwargs: 可变关键字参数。2.谈一谈Python中的装饰器Python中的装饰器其实也是一种函数, 它可以在不修改原函数代码情况下扩展原函数功能。装饰器函数...

    我只是做一个汇总, 部分题目答案来源其他网站。

    Python相关

    1.*args, **kwargs是什么意思?*args: 可变位置参数。

    *kwargs: 可变关键字参数。

    2.谈一谈Python中的装饰器Python中的装饰器其实也是一种函数, 它可以在不修改原函数代码情况下扩展原函数功能。装饰器函数与普通函数不同之处就在于装饰器函数返回了一个函数对象,装饰器利用了闭包的原理来实现。主要用于日志插入,权限管理等等。

    3.Python的垃圾回收机制以及内存管理垃圾回收机制:

    Python的垃圾回收机制以引用计数为主, 标记清除、分代回收为辅。引用计数指:Python在内部维护了针对每一个对象的引用计数, 当一个对象创建或者被引用时,其引用计数将加1,当一个对象被销毁或作用域失效时, 其引用计数将减1。只有对象的引用计数为0时,这个对象将会被回收。引用计数的优点:简单、具有实时性。缺点:对象循环引用时将永远不会被销毁。对于对象循环引用的状况Python使用标记清除来解决,Python在内部实现了一个循环检测器, 不停的检测对象是否存在循环引用,如果两个对象互相循环引用并且不包含其他第三者对象时, 其将会被收回。在Python参考手册中有写道:

    当一个对象无法获取时, 那么这个对象有可能被当成垃圾销毁了。Python将所有对象分成了三代, 对象存活时间越长就越晚被回收, 反之则越早被回收。

    内存管理:

    Python使用了内存池机制来管理内存,其内存以金字塔的形式对内存功能进行划分,-1、-2层主要用于对操作系统进行操作, 0层中是C的malloc,、free等等内存分配和释放函数。1、2层是一个内存池, 当对象小于265K时将直接由这片内存池进行分配内存,否则将调用第0层中的C函数来分配内存,当小于265K的对象被销毁时, 其内存也不会被销毁, 只是返回给了内存池以便二次利用。2层是对Python对象进行操作。

    4.Python多线程Python中多线程由于有GIL的影响, 导致在任意时间内只有一个线程在运行,所以Python的多线程在处理计算密集型任务上效果反而不如单线程, 只有在处理IO密集型任务上多线程才能发挥实力,在等待IO过程中Python C源码会释放GIL, 最终会导致线程在等待IO过程中会被暂停去执行其他的线程。python中GIL主要是由于历史原因导致Cpython虚拟机中的GIL难以移除,同时GIL的存在保证了多线程之间数据完整性以及状态同步。

    5.说明os、sys模块不同,并列举常用的模块方法os: 提供了对使用操作系统函数的高度封装

    sys: 提供由解释器访问或者维护的变量以及与解释器交互的一些函数

    os模块只负责程序与操作系统交互, 提供了访问操作系统底层的接口封装。

    sys模块负责程序与解释器交互, 提供了一系列的函数用于操控Python运行的环境设置。

    os模块常用方法:

    os.getcwd() # 获取当前运行路径

    os.remove() # 删除指定的文件

    os.walk() # 生成指定目录下的文件夹以及文件

    os.makedirs() # 生成多成目录

    os.mkdir() # 生成目录

    os.rmdir() # 删除指定目录

    os.removedir() # 删除多层目录

    os.listdir() # 列出指定目录下所有的文件夹以及文件

    os.path.join() # 将分离的各部分组合成一个路径名

    os.path.getsize() # 获取指定文件大小

    os.path.exists() # 查看指定目录或者文件是否存在

    os.path.isabs() # 查看指定目录是否为绝对路径

    ...

    sys模块常用方法:

    sys.argv# 命令行参数列表

    sys.exit() # 退出程序并返回指定的整数

    sys.maxunicode # 最大的Unicode值

    sys.modules # 系统导入的模块名称

    sys.path # python搜索模块时的路径

    sys.stdout # 标准输出

    sys.stdin # 标准输入

    sys.stderr # 错误输出

    ...

    6.什么是lambda表达式?它有什么好处?lambda也是函数的一种, 在处理一些简单的操作时可以使用该表达式, 其好处是不用为一些实现简单功能的函数命名,毕竟编程只有两个难点: 缓存失效, 命名。

    7.Python里面如何拷贝一个对象?Python中拷贝分为深拷贝、浅拷贝。浅拷贝只拷贝父级对象, 不会拷贝对象内部的子对象,使用copy模块中的copy。深拷贝则会完全拷贝父对象以及子对象, 使用copy模块中的deepcopy。

    8.__new__和__init__的区别。__new__负责构建一个类对象并将其返回,__init__则负责初始化一些变量,不返回任何对象。在实例化一个类时, __new__方法将会先被运行, 其次才运行__init__方法。

    9.python中协程?Python中协程最初使用yield来实现, 当程序运行到yield语句时就会将控制权交出来去执行其他的函数, 在Python3之前只能通过原生yield、greenlet以及Gevent第三方库来实现协程, 在Python3 之后引入了yield from, yield from 用于重构生成器。在Python3.5之后引用了async和await, 其作为yield from, yield的完美替身来实现协程。

    10.Python的异常机制?Python中异常也是一个对象, 所有的异常的基类都是Exception。捕获异常使用try...except....语法,如果要try与except之间的代码出现了错误并且我们将其异常类型捕获了那么代码将会跳转代except中去执行。还可以使用raise 去手动的触发一个错误,也可以使用assert来触发异常, 只不过assert经常用来在测试中, 并且assert对程序的性能有着极大影响,只有内置的__debug__为True时assert才会执行。

    11.python旧式类(经典类)和新式类的区别经典类与新式类的区别是:继承搜索的顺序发生了改变,经典类多继承搜索顺序是深度优先, 按照从左至右的查找,并且将每一个父类的基类都查找一遍。新式类则是, 先从左至右的查找, 然后再向每一个父类的基类进行查找。(都是从左至右的顺序查找, 经典类查找一个父类时同时向上查找,新式类则是先查找所有的父类然后再向上查找)

    12.classmethod,staticmethod,property是什么?有什么作用?classmethod,staticmethod,property都是装饰器, 他们都作用在类的方法上。

    classmethod:使得被装饰的方法成为一个类方法既不需要实例化类就可以直接调用的方法,第一个参数为cls。

    staticmethod: 使得被装饰的方法成为一个静态函数既与普通的函数无区别。

    property: 将一个方法变成一个属性来使用。

    13.python中的绑定方法和未绑定方法是什么绑定方法:绑定了实例化的方法既第一个参数是self

    未绑定方法:没有绑定实例化的方法既类方法、静态方法

    14.python上下文管理器是什么?Python中上下文管理器使用with来调用主要用于数据库连接,文件操作, 网络操作。

    其作用是: 如果在进行一些打开资源操作时出现了异常,上下文管理器将会自动的执行一些资源清理操作。在进入上下文管理器时, Python会先调用对象的__enter__方法, 该方法返回一个对象用于进行一些操作,如果在进行一些操作时发生了异常Python则调用__exit__该对象接受三个参数第一个参数异常类,第二个参数异常提示字符串, 第三个参数traceback对象。

    15.functools的wraps是做什么的?wraps是一个装饰器功能是: 由于被装饰的函数传入到装饰器中时已经不是原函数了, 而是一个新的函数, 并且丢失一些原函数的属性, 为了不影响函数的使用, 可以使用wraps来抵消这种副作用。

    16.请说一说ORM实现原理ORM使用了Python的属性描述符协议实现,通过另外一个类来描述类变量的属性类型, 再给这个属性进行赋值时(对应数据库中的字段名称)会调用__set__方法,访问属性则会调用__get__方法删除则调用__delete__方法。

    17.请说一说迭代器和生成器区别?生成器时一种特殊的迭代器, 生成器自动实现了迭代器协议, 不需要手动的实现__iter__以及next方法,生成器在迭代的过程中可以改变当前的迭代值, 而普通的迭代器改变当前值时往往会发生错。迭代器必须实现__iter__以及next方法。

    18.描述一下type()的作用当type只传入一个参数时将返回该参数的类型,如果传入了三个参数则返回一个类对象,同时Python中的所有类的基类都是type

    19.Python中列表与元组的异同?相同: 列表和元组都是容器并且是可迭代对象,二者可以包含任意类型的对象。

    不同:列表是可变的, 元组是不可变。

    20.Python中的列表是如何实现的?Python中的列表使用了分离式技术实现的动态顺序表。

    21.Python中列表的索引查询的时间复杂度是多少?O(1)

    22.Python字典的实现原理?Python的字典使用了哈希表来储存key、value,当添加一个数据时首先会把key通过哈希函数转换成一个数字, 然后将该数字对存放value的数组长度取余并将取余结果当做数组的下标, 将value存放在该取余结果为下标的数组中。数据查询时将key转换为对应的数组下标,并定位到数组的位置获取value。

    23.什么是pickling和unpickling?Pickle模块读入任何Python对象,将它们转换成字符串,然后使用dump函数将其转储到一个文件中——这个过程叫做pickling,反之从存储的字符串文件中提取原始Python对象的过程,叫做unpickling。

    24.有哪些工具可以帮助debug或做静态分析?PyChecker是一个静态分析工具,它不仅能报告源代码中的错误,并且会报告错误类型和复杂度。

    Pylint是检验模块是否达到代码标准的另一个工具。

    dis用来查看Python对象的字节码。

    25.Python中的作用域?在Python中,一个对象的作用于总是由代码被赋值的地方所决定的。当遇见一个变量时Python会按照: 本地作用域→ 当前作用域被嵌入的本地作用域→ 全局/模块作用域→ 内置作用域顺序搜索。

    26.Python的参数传递是值传递还是引用传递?可变对象使用引用传递, 不可变对象使用值传递

    27.写一个函数, 输入一个字符串, 返回倒序排列的结果

    def reverse(text):

    return text[::-1]

    28.python中is和==的区别is比较的是对象在内存的地址, ==比较的对象中的值

    29.什么是Python的闭包?内层函数引用了其外部作用域的变量,然后返回内层函数的情况,称为闭包,创建一个闭包必须满足以下几点:

    1. 必须有一个内嵌函数

    2. 内嵌函数必须引用外部函数中的变量,外层空间中被引用的变量叫做层函数的环境变量

    3. 外部函数的返回值必须是内嵌函数

    4. 环境变量和内层非全局函数一起构成了闭包

    30. Python的自省?type(),dir(),getattr(),hasattr(),isinstance()

    31.Python并发的解决方案Twisted是一个事件驱动型的网络引擎,不同于单线程和多线程模式,这种模式不需要过多去关心线程锁的问题,当遇到高并发问题时候,采用twisted会很好解决数据共享的问题。

    Tornado既是一个web server,也是web framework。就是说这个web框架有自己内置的web server,在写web时候可以用到它的高性能网络库,甚至有公司拿这个来做游戏的服务器,可以用它处理高并发问题。

    Gevent是基于协程的Python网络库,基于libev的快速事件循环,基于greenlet的轻量级执行单元,API的概念和Python标准库一致。

    sanic基于uvloop和httptools实现高并发异步网络框架

    操作系统相关

    1.进程的有哪几种状态以及导致转换的事件。进程有5种状态:

    运行态:该进程正在执行。

    就绪态:进程已经做好了准备,只要有机会就开始执行。

    阻塞态(等待态):进程在某些事情发生前不能执行,等待阻塞进程的事件完成。

    新建态:刚刚创建的进程,操作系统还没有把它加入到可执行进程组中,通常是进程控制块已经创建但是还没有加载到内存中的进程。

    退出态:操作系统从可执行进程组中释放出的进程,由于自身或某种原因停止运行。

    导致转换的事件:

    1. 空->新建:创建执行一个程序的新进程,可能的事件有:新的批处理作业、交互登录(终端用户登录到系统)、操作系统因为提供一项服务而创建、由现有的进程派生等。

    2. 新建->就绪:操作系统准备好再接纳一个进程时,把一个进程从新建态转换为就绪态。

    3. 就绪->运行:需要选择一个新进程运行时,操作系统的调度器或分配器根据某种调度算法选择一个处于就绪态的进程。

    4. 运行->退出:导致进程终止的原因有:正常完成、超过时限、系统无法满足进程需要的内存空间、进程试图访问不允许访问的内存单元(越界)、算术错误(如除以0或存储大于硬件可以接纳的数字)、父进程终止(操作系统可能会自动终止该进程所有的后代进程)、父进程请求终止后代进程等。

    5. 运行->就绪:最常见的原因是,正在运行的进程到达了“允许不中断执行”的最大时间段,该把处理器的资源释放给其他在就绪态的进程使用了;还有一中原因可能是由于具有更改优先级的就绪态进程抢占了该进程的资源,使其被中断转换到就绪态。

    6.运行->阻塞:如果进程请求它必须等待的某些事件,例如一个无法立即得到的资源(如I/O操作),只有在获得等待的资源后才能继续进程的执行,则进入等待态(阻塞态)。

    7.阻塞->就绪:当等待的事件发生时,处于阻塞态的进程转换到就绪态。

    8.就绪->退出:在上图中没有标出这种转换,在某些进程中,父进程可以在任何时刻终止一个子进程,如果一个父进程终止,所有相关的子进程都被终止。

    9.阻塞->退出:跟上一项原因类似。

    2.进程与线程的区别。进程是资源分配的最小单位,线程是程序执行的最小单位。

    进程有自己的独立的地址空间, 线程共享进程中的数据,使用相同的地址空间。

    进程自己通信方式主要使用特别的方式来进行通信。线程之间的通信非常的方便, 同一进程下的线程共享全局变量、静态变量等数据。

    多进程程序更加的健壮,其中一个进程死掉了并不影响其他的进程,多线程中只要有一个线程死掉,那么整个进程也死掉了。

    3.进程通信的几种方式。进程之间进行通信常用的有几种方式:管道,消息队列, 信号量, 共享内存

    管道通常指无名管道, 他的特点包括:

    1.半双工:数据只能在一个方向流动,一端为读端,一端为写端

    2.有关系进程通信: 管道只能在具有亲缘关系的进程之间进行通信,如父子进程、兄弟进程

    3.文件: 管道是一种特殊的文件它有着像普通文件读写一样的API, 它只存在于内存中。

    Python实现:

    import os

    from time import sleep

    def child(wpipe):

    while 1:

    msg = "hello world!".encode()

    os.write(wpipe, msg)

    sleep(2)

    def parent():

    rpipe, wpipe = os.pipe()

    pid = os.fork()

    if pid == 0:

    child(wpipe)

    else:

    os.close(wpipe)

    fb = os.fdopen(rpipe, 'r')

    while 1:

    recv = os.read(rpipe, 1024)

    print(recv.decode())

    parent()

    # 输出

    """

    >>> python3.6 ./pipe.py

    hello world!

    hello world!

    hello world!

    hello world!

    hello world!

    hello world!

    hello world!

    hello world!

    hello world!

    hello world!

    """消息队列存放在内核中, 一个消息队列有一个标识符来标识, 它的特点:

    1.消息队列是面向记录的, 其中消息具有特定的格式和特点的优先级

    2.消息队列独立于发送方和接受方,即使进程终止,消息队列中的消息并不会被删除。所以它可以用于无关进程之间通信

    3.消息队列可以对消息实现随机读取, 不需要按在特定的顺序来读取。

    信号量属于系统层面, linux系统也是通过信号量来管理进程,进程一旦接收到信号就会打断原来的程序执行流程来处理信号。

    import os

    import signal

    def handler(signalnum, frame):

    global receive_times

    print("收到信号", signalnum, frame)

    def main():

    print(os.getpid())

    signal.signal(signal.SIGTERM, handler)

    while True:

    pass

    if __name__ == '__main__':

    main()运行上面程序, 在另一个终端输入 kill pid,程序将会打印

    ...收到信号 15

    共享内存是最简单的通信方式, 他允许多个进程(无关进程, 有关进程)访问同一片内存, 一个进程改变其中的数据后, 其他的进程也能看见数据的变化。共享内存特点:

    1.进程共享同一块内存

    2. 访问共享内存和访问私有内存一样快

    3.不需要系统调用和内核入口

    4.不造成不必要的内存复制

    Python可以使用multiprocessing中Value、Array、Manager等等实现

    4.线程同步几种方式线程同步通常有4中方式: 临界区、事件、互斥量、信号量。

    临界区:拥有临界区的线程可以访问被保护起来的资源或者代码段, 其他线程如果想访问则被挂起, 直到拥有临界区对象放弃临界区为止。Python中使用:threading.Lock()实现。

    事件:可以自定义一个事件, 如果这个事件一直不发生, 则这些线程将会阻塞, 直到事件发生。 Python中使用threading.Event()实现 。

    互斥量:互斥量为资源引入了状态:锁定/非锁定, 某个线程要更改共享数据时, 先将其锁定, 此时其他线程不能对该资源进行操作, 直到资源被释放。Python中使用threading.Lock()实现 。

    5.用户线程与内核线程的区别用户线程的优点:

    1.线程切换不需要内核态特权, 进程不需要为了线程管理而切换到内核态。

    2. 可以为应用程序量身定做调度算法而不影响系统调度程序。

    3.用户级线程可以再多个平台上运行, 不需要对内核进行修改以支持用户级线程。

    用户线程的缺点:

    1.当一个用户级线程执行一个系统调用时, 不仅这个线程会被阻塞, 进程中的所有线程都会被阻塞。

    2.在用户级线程策略中, 一个多线程应用程序不能利用多处理技术。

    内核级线程优点:

    1.线程切换由内核控制,可以很好的利用多核CPU。

    2.由操作系统内核创建和撤销, 一个内核级线程阻塞并不影响其他的线程运行。

    内核级线程缺点:

    1.由内核进行调度。不能跨平台。

    用户级线程和内核级线程的区别:

    1.内核线程是内核可感知的, 用户级线程是内核不可感知的。

    2.用户级线程创建,撤销等等不需要内核的支持, 内核级线程创建,撤销等等都需要内核的支持。

    3.用户级线程在调用系统指令是会导致其所属的进程被中断, 内核级线程在调用系统指令时, 只会导致该线程被中断, 与其他线程无关。

    4.用户级线程CPU调度以进程为单位, 用户程序进行线程的控制, 内核级线程CPU以线程为调度单位, 由系统的线程调度程序负责线程的调度工作。

    5.用户级线程的程序实体运行在用户态下程序, 而内核级线程的程序则可以运行在任何状态上。

    6.进程池、线程池的原理?线程池: 开启一定数量的线程并让其睡眠, 当需要一个线程去执行某种任务时, 唤醒某个线程让它执行任务, 任务执行完毕又让其睡眠。

    进程池同理

    7.进程为什么会产生死锁?导致死锁的原因:

    1.因为系统资源不足

    2.进程运行推进顺序不合适

    3.资源分配不当

    导致死锁的四个必要条件:

    1.一次一个进程只能访问一个资源, 其他进程不能访问已分配的资源。

    2.当一个进程等待其他进程时, 继续占有已分配的资源时

    3.不能强行抢占进程已有的资源

    4.存在一个封闭的进程链, 导致每一个进程都占有下一个进程所需的资源

    8.操作系统的四个特性?1.并行: 并行是指两个事件以上(包含)在同一时刻发生既物理上这些事件是同时发生的。

    2.共享: 系统中的资源可供内存中的多个进程共同使用, 由于资源的属性不同, 多个进程对资源共享方式也不同。

    3.虚拟:操作系统中的虚拟通过分时技术将多个物理设备转换成若干个逻辑上的对应物。

    4.异步:在多道程序设计环境下允许多个进程并发执行。

    9.什么是缓冲区溢出?有什么危害?其原因是什么?缓存区溢出指计算机在向缓存区填充数据时超过了缓存区的最大值, 溢出的数据覆盖在了合法数据上。

    其危害: 程序崩溃, 导致拒绝服务。跳转并执行恶意代码。

    造成缓存区溢出的原因主要是没有对用户的输入进行检查。

    10.操作系统中进程调度策略有哪几种?优先级服务,时间片轮换, 多级反馈

    网络相关

    1.TCP为什么需要3次握手三次握手的目的是:防止已失效的连接请求报文又传入到服务端,导致错误。

    2.TCP和UDP有什么区别?tcp是传输控制协议,其提供面向连接、可靠的字节流服务,通信双方必须依照三次握手协议连接之后才能传输数据, tcp提供了超时重传、 丢弃重复数据、检验数据流量控制等功能。

    UDP是用户数据包协议, 它提供了一个简单的不可靠的面向无连接的服务,在双方未连接时也能传输数据因而速度特别快。

    3.TCP/IP的流量控制?利用滑动窗口实现流量控制

    4.HTTP的长连接和短连接?短连接: 客户端与服务端每进行一次HTTP操作就建立一次连接,请求结束就断开连接。

    长连接:客户端与服务器进行第一次HTTP操作后, TCP连接并不会断开连接, 下次请求将复用这条TCP通道

    http://5.IO中同步与异步,阻塞与非阻塞区别同步和异步关注的是消息通信机制。

    同步:发出一个调用时, 在没有得到结果之前这个调用不会返回结果, 如果调用返回那么说明得到结果了。

    异步:发出一个调用后立刻返回, 但是返回时没有结果的。

    阻塞与非阻塞关注的是程序在等待调用的结果

    阻塞:调用结果被返回前该线程被挂起, 直到得到结果后,该线程继续运行。

    非阻塞:不能立刻得到结果之前, 该函数不会阻塞当前线程, 会立刻返回。

    6.Cookies 和 Session的区别cookies是一种保存在客户端上的字符串用于用户与服务端会话持久的保持数据

    Session是一种保存在服务器的字符串, 其功能与cookies相同, 但是session是在cookies基础上实现的。

    7.什么是TCP粘包、TCP粘包发生了怎么处理?TCP粘包是指发送方发送了若干个包到接收方接受时都粘成了一个包, 从缓存区来看后一个包的头部数据紧紧的接着前一个包的尾部。

    对于TCP粘包的情况有两种处理方式:

    1. 接收方: 可以选择关闭tcp默认的nagle算法来避免粘包

    2.应用层处理: 格式化数据, 对于每一条数据都采用相同的格式必须有开始符以及结束符, 这样即使发生粘包也可以通过开始符和结束符判断数据边界, 也可以在数据开头就将该条数据的长度填充进数据中, 如果发生粘包则可以使用数据长度来区分每一条数据。

    UDP不会发生粘包, 因为UDP没有使用块的合并优化算法,导致接收端的缓存区内按照链式的结构来储存每一个UDP包, 并且每一个UDP包都有消息头,这样接收方就很好的进行拆包。

    8.TCP中的time_wait是什么情况?出现过多的close_wait可能是什么原因?timewait值tcp中主动断开连接一方的一个状态, 当主动断开连接的一方发送给对方FIN包,且对方回复了ACK+FIN时, 主动断开连接的一方将进入time_wait状态, 并持续到2msl后进入CLOSE状态。

    出现过多的close_wait的原因:被动关闭方未关闭socket造成。

    解决办法:

    1.为socket设置超时

    2.调整系统参数, 包括句柄参数和TCP/IP参数

    9.epoll,select的区别?边缘触发,水平触发区别?epoll将每一个监听事件都储存在了红黑树中并且只返回被触发的事件。epoll在睡眠结束后只需要检测就绪链表是否为空。

    select则将时间都放入一个列表中, 当其中某个事件被触发时,select将所有的事件返回给用户。select睡眠结束后需要遍所有的监听事件。

    10. tcp三次握手, 四次挥手三次握手:

    客户端 服务端

    ->SYN=1, seq=x

    -> ACK=1, ack=y+1, seq=x+1

    data

    四次挥手:

    主动关闭方 被动关闭方

    data

    ->FIN=1, seq=x

    -> ACK=1, ack=z+1, seq=x+1

    数据储存与缓存相关

    1.数据库事务的四个特性及含义数据库事务的4个特性:原子性、持久性、一致性、隔离性

    原子性:整个事务中的所有操作要么全部完成, 要么全部都不完成, 如果在事务中操作出现异常,那么事务将会进行回滚, 就像这个事务从来没有执行过一样。

    持久性:在事务完成后,该事务所有的操作都将持久化在数据库中, 不会被回滚。

    一致性:在事务开始之前和事务结束之后, 数据库的完整性约束并没有被破坏。

    隔离性:确保在同一时间类只有一个事务处理某个数据。

    2.数据库索引使用了什么数据结构?数据库索引对于非主键索引使用B树, 对于主键索引使用B+树

    3.数据库优化的思路SQL语句优化:

    1. 尽量避免在where语句后面使用 !=、<>操作符以及对NULL值得判断, 否则引擎将放弃索引而使用全表扫描。

    2. 使用exists替换in。

    3. 尽量放弃使用select *, 需要什么数据就取出什么数据。

    4. 使用join代替子查询。

    5. 设置合适的字段属性:例如尽量把字段设置为NOT NULL, 这样引擎就不要对比NULL值

    4.MySQL中myisam与innodb的区别1. innodb支持事物, myisam不支持事物

    2. innodb支持行级锁, myisam支持表级锁

    3. innodb支持MVC, myisam不支持

    4. innodb支持外键, myisam不支持

    5. innodb不支持全文索引,myisam支持

    5.Redis支持的数据类型字符串,集合, 有序集合,哈希, 列表

    6.redis持久化的几种方式1. 快照: 默认使用这种方式,将数据快照存放在特定的二进制文件中。

    2. AOF: 将每一条命令都储存, 恢复时再将每一天命令进行运行。

    7. redis如何实现热数据缓存?当redis的内存数据大小上升到一定大小时, 就会实施数据淘汰策略, redis提供了6中数据淘汰策略

    volatile-LRU:从已经设置过期时间的数据中挑选最近最少使用的数据淘汰

    volatile-TTL: 从已经设置过期时间的数据中挑选即将要过期的数据淘汰

    volatile-RANDOM: 从已经设置过期时间的数据中随机选择数据进行淘汰

    allkeys-LRU:从数据集中挑选最近最少使用的数据淘汰

    allkeys-random:从数据集中任意选择数据淘汰

    no-enviction:禁止驱逐数据

    8.Redis 常见的性能问题都有哪些?1. master写内存快照, save命令调度rdbSave函数会阻塞主线程的工作, 可能会导致间断性的暂停服务。

    2. master AOF持久化, 最好不要使用AOF来进行持久化, 这个持久化方式对性能有着极大的影响。

    3. redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内。

    9.mysql字符集和排序规则?mysql中一个字符集至少有一个或者多个排序方式, 比如utf8就有:utf8_general_ci , utf8_general_cs等等。

    排序规则命名规则:字符集名字_语言_后缀, 其中

    1. _ci:不区分大小写的排序方式

    2. _cs:区分大小写的排序方式

    3. _bin:二进制排序方式,大小比较将根据字符编码,不涉及人类语言,因此_bin的排序方式不包含人类语言

    字符集最常用的包括utf8, utf8md4。

    10.varchar与char的区别是什么?大小限制?utf8字符集下varchar最多能存多少个字符?char和varchar最大的不同就是一个是固定长度,一个是可变长度。由于是可变长度,因此存储的是实际字符串再加上一个记录字符串长度的字节。如果分配给char或varchar列的值超过 列的最大长度,则对值进行裁剪。

    varchar(M)和char(M),M都表示字符数.varchar的最大长度为65535个字节,不同的编码所对应的最大可存储的字符数不同。char最多可以存放255个字符,不同的编码最大可用字节数不同。

    字符类型若为utf8,每个字符最多占3个字节,varchar最大长度不能超过21845。

    11.primary key和unique的区别?一个表只能有一个primary key, 一个表可以有多个unique key。

    unique key约束只针对非主键列, 可以为空值, primary key约束针对主键列, 不允许有空值。

    12.外键有什么用,是否该用外键?外键一定需要索引吗?外键是为了一张表记录的数据不会太过冗余,也是为了数据的一致性和完整性。

    如果业务逻辑相当的复杂那么建议使用外键来保证数据的一致性和完整性, 如果业务逻辑不复杂则可以不使用外键, 仅靠程序中来保证数据的一致性和完整性, 或者业务对数据的一致性完整性要求相当的高, 那么一定要用外键。同时如果为了不让mysql在性能有任何的形象应该避免使用外键。 所有应该视当前业务,数据等情况决定是否使用外键。

    外键需要索引, 因为外键在查询,更新,删除数据时会对数据进行查找, 所以需要对外键建立索引。

    13.索引有什么用?对于建立索引的列, mysql的查询效率会提高很多。

    14.谈谈redis的事务?用事务模拟原子+1操作?原子操作还有其它解决方案吗?redis的事务使用关键字multi开启事务, 使用exec执行事务中的语句,它可以执行多条语句, 所有的命令按照先进先运行的的运行, 不会被其他的命令加塞。

    用事务模拟原子+1操作:

    multi

    incr xx

    exec

    原子操作 可以使用 incr操作实现

    15.redis集群?

    安全相关sql注入是怎么产生的,如何防止?sql注入产生原因:因为在程序开发过程中没有对sql语句进行检查或未进行关键字检查, 导致客户端可以提交sql语句到服务器运行。

    如何防止:

    1.对sql与进行检查, 过滤。

    2.不要使用sql拼接的方式来拼接sql语句, 对常用的方法进行封装避免暴露sql语句(使用ORM)。

    2.xss如何预防?对用户输入做严格的防范, , 在服务端对用户数据进行转义处理。

    3.csrf是什么?如何防范?csrf成为跨站伪造请求, 利用用户信任过的网站去执行一些恶意的操作

    如何防范:

    1.检查Referer字段, 严格要求该字段只来自于信任的URL

    2.添加校验token,将token值附加在表单中,攻击者是无法获取这个字, 服务端进行检查发现该值为空时将会拒绝服务。

    展开全文
  • 一、什么是信息流信息流众多种类媒体类型的其中之一。其目的获客、更多用户使用。获客,通过开拓新渠道可得到;更多用户,通过开拓、管理现有渠道可得到。渠道策略为了将客户转化为营收。渠道分析视为了整合...

    一、什么是信息流

    信息流是众多种类媒体类型的其中之一。

    其目的是获客、更多用户使用。获客,通过开拓新渠道可得到;更多用户,通过开拓、管理现有渠道可得到。

    渠道策略是为了将客户转化为营收。

    渠道分析视为了整合渠道资源实现渠道的高收益率。

    渠道、策略、产品、客群,前端渠道和后端运营,不能割裂开来,而是俱为一体看待,通盘考虑。

    信息流:关于Feed这个词,挺有意思,vt.喂饲养……;供给,使……满足

    过去,人在找信息,现在,信息找人。

    关键点:算法

    朋友的状态更新,朋友们最近看了些什么,重要新闻推送。

    关键是,这些内容中夹杂不少原生广告或软文。对用户行为习惯的分析,从而做的智能推荐。

    二、渠道推广策略--策划案

    1.专人专责。策划案主题、目标客群、执行渠道、方案开始执行时间和结束时间、预期达到的效果等信息,需要知情。

    2.渠道推广策略,要和运营端一起,通盘考虑。前端出方案,要考虑到后端执行问题。渠道推广的方案,是为了更好获客,进而产生营收,所以必须考虑到后端产品运营。

    三、指标体系

    1.数据获取

    1)推广账户以往数据画像,如果是有过推广账户数据的,可以根据后台的人群画像数据分析。

    2)百度指数搜索行业大词,如果是没有以往推广数据的,可以通过大数据分析,如百度指数工具来分析。

    比如在线教育、互联网教育等,可以多换几个相关关键词。可以打开百度指数直接搜索“房地产”,看一下人群画像,如地区、年龄、性别、兴趣等。

    3)找一线销售或客服了解客户情况,销售是最了解客户情况的,比如性别、年龄、职业等。

    4)中国知网上有很多关于信息流广告的分析。--培养全盘考虑的格局、前瞻性的眼光和预测未来的嗅觉的。

    2.渠道管理

    一句话概括:一个好的渠道一定有一套好的管理指标。

    分析的本质是分类和比较。要做渠道分析,先做好渠道分类。各行业有自己的特点,各公司也都有从行业特性、本身业务出发的分类体系,此处不再赘述。

    只提供渠道分析指标体系,具体如下图:

    526eefef78563b051680ca5542ebcd0c.png

    图丑~见谅~

    1)财务能力:

    利润率、投产比、回款天数;渠道费用占比。

    2)渠道拓展能力:

    从投产比、覆盖广度、渠道深度等评估渠道推广质量,进而合理分配在各渠道的投入。

    拓展速度、渠道广度、渠道深度

    3)渠道营收能力:

    收款、客户流失率(与C端客户生命周期分析相结合)、市场占有率。

    渠道配合度:渠道策略制定方、合作的渠道方

    第一,结合现阶段业务发展情况,在对合作渠道方深入了解的基础上,洞察各渠道用户的消费行为和习惯,制定渠道业务的整体优化方案并快速分解出执行逻辑,推进方案落地执行;

    第二,保证及时准确提取渠道获客数据、衡量合作渠道对于我方各种活动策略的参与度,如果效益良好,则在该渠道进一步增加投入,扩大市占率。

    第三,结合财务数据,分析渠道利润率、投资回报周期,进而在下一个促销时点到来前提前做好渠道营销策略。

    四、渠道目标管理:

    第一,目标预测,自上而下和自下而上两种方式。一般用在对下一年度的访问量预测中。

    第二,目标制定、分解与管理。逐日、逐周、逐月持续进行目标跟进、关键指标极大值追踪。

    第三,通过数据,发现渠道推广中的主要问题,并定位问题、分解问题、提出解决方案。

    第四,与渠道目标达成进度相适应的奖励政策。

    1.对渠道根据推广结果归类:

    根据渠道一定周期内的表现,对渠道进行归类。

    第一,根据客户重要程度,KA渠道、非KA渠道

    第二,根据是否促销,正价渠道、特卖促销渠道等。

    第三,根据客户满意度,客户非常满意渠道、比较满意、一般满意。

    客户满意度相关指标:投诉率、投诉相应时间、拒绝评价客户比率、评价产品、来源渠道等。

    2.日活和月活:DAU/MAU

    举例,从1月中到2月底,DAU有一个上升的趋势;但是接下来的一段时间,DAU停滞不前了;从四月中下旬开始,又开始上升。当新进来的用户大于流失的用户时,活跃用户上升;持平时,DAU基本稳定。问题的关键在于,随着用户的累积,流失的用户越来越多。

    --------解决用户流失的问题,即留住用户。

    某一款APP,元旦发布。

    1.1新增10000

    1.2留存5000 50% 1.2新增20000

    1.3活跃4000 40% 1.3留存7000

    1.4活跃3000 30% 1.4留存6000

    1.5活跃1800 18%

    ……

    1.30活跃650 6.5%

    1.31活跃400 4%

    这个APP 1月1日发布,每天都有新增,每天也有流失(或沉默)客户。

    (流失的渠道,设定一个底线。比如盈亏平衡点)

    影响DAU的主要因子,是过去N日每一天的新增用户,以及每一天的用户在第N日的留存率。

    提炼一下就是两个大指标:新增用户和留存率。新增用户可以受到很多条件的影响,比如最直接的付费推广。同样,留存率的影响也会受到诸多因素的影响,比如产品本身的改进等。但是,不管采用什么手段,最终的DAU都是会通过新增和留存这两个指标反映出种种举措、因素所带来的变化,这两个指标是一切因素的归口

    3.前端后端,一体看待

    渠道是通路,即产品通过什么样的途径到达消费者手中。

    产品、渠道、价格、促销、运营,一体看待,ADP模型,市场增长的要素是什么。

    通过数据,定位出相较竞争对手、相较企业的最大值,差距在哪个模块。

    一款刚上市的产品,D只有竞争对手的1/10,一年中要把一半的精力放在这方面。自己的客户满意度是a%、竞争对手的客户满意度是b%,于是呢企业将目标定位a增长1倍,D增长4倍,即销售额增长5-6倍。对于一个成熟期的产品/企业来说,这个增长幅度就值得狠狠冲刺拼搏一把了。

    前端营销和后端运营,最终目的一致,即提升销售额。

    渠道驱动,丰富现有渠道、拓展新渠道

    产品驱动,产品线的广度--品牌、宽度--品类、深度--SKU单品管理

    消费者驱动,挖掘消费者数据、发现他们更多需求、最大程度满足;生产决定消费、培养市场(中读、喜马拉雅细分市场做得非常不错)

    产品分类---渠道特征----推广人群

    高价位、中价位 价格容忍度

    高毛利、低毛利

    导入期、成长期、成熟期、衰退期

    二八分类法则--重点商品、非重点商品

    展开全文
  • 大佬口中的中台到底是什么提起“中台”可能很多人没有那么熟悉,但是如果说“前台”和“后台”,你肯定知道是什么意思。日常中提到的前台多是指与企业终端用户直接产生交互的业务平台,比如咱们日常使用的APP、门户...

    c72ede6a256b0197e75a2284d7d520fa.png

    大佬口中的中台到底是什么

    提起“中台”可能很多人没有那么熟悉,但是如果说“前台”和“后台”,你肯定知道是什么意思。

    日常中提到的前台多是指与企业终端用户直接产生交互的业务平台,比如咱们日常使用的APP、门户网站等,前台通常的要求是机动灵活,能对用户的需求作出最快的反馈;而后台则是指企业各个后端管理系统组成的支持平台,说白一点就是IT支持类,比如企业内的数据库、各个运维系统(如ERP、CRM系统)等,后台强调的是稳定。

    770dbb5da015d2c9361da782f24b06dd.png

    从上面的分析我们可以发现,前台强调的是对用户的需求作出快速反馈,需要做到快速迭代,而后台更多的是帮助企业管理一些核心数据,更多的要求是稳定;因此两者的要求及目的并不相同。

    随着业务不断的发展壮大,企业更加需要保持后台系统的稳定,而前台系统因为要对迅速相应用户的需求,所以就会有大量的新业务需求被加到前台系统中,这就导致企业很多是都做了重复的工作,而且前台系统也越发膨胀,对用户的相应能力也变慢了。

    所以在企业运行中两者就出现了衔接不畅问题!为了确保前台、后台既能更好地独立工作,又能协调一致做好衔接,就衍生出了“中台”这一概念。

    中台的由来和发展

    说了中台的概念,就不得不提阿里了。据说在2015 年,马云带队阿里的高管前往游戏公司 Supercell 参观考察,大家可能对这个公司不太熟悉,但是《部落冲突》《海岛奇兵》等游戏你一定不陌生,这些都是他们开发出来的。

    这家总数不到200人的公司,每一个开发游戏的小团队,都只有六七个人,但是整个公司年利润却有10多亿美元,创收惊人!这么小的团队是如何做到这个成果的呢?其中一个原因就是,他们挑选了一些游戏开发过程中常用的游戏算法,并把它们作为固定的工具提供给所有的小团队,同一套工具,能够满足很多小团队的研发需求。这种管理方式就是所谓的“中台”的模式。

    8544c435fe061232beb73e51b483418f.png

    此次参观之后,阿里备受启发,也迅速开展了自己的“中台战略”。阿里提炼各个业务板块的的共性需求,并打造组件化的资源包,然后开放给前台各业务部门使用,最大限度地减少“重复造轮子”。

    对阿里而言,它有着得天独厚的中台土壤。我们一起来看:阿里的前台业务内容包括淘宝、天猫、1688、聚划算、闲鱼等平台,而管理后台则是大量的数据库运维系统,比如订单管理系统、用户信息系统等等。

    我们会发现实际上淘宝、天猫以及聚划算等业务板块虽然相互独立,但是用户确还是那群人,用户下了订单还是需要同样的方式去处理。因此,就没有必要针对不同的业务板块来做单独开发了,大家可以共用一套用户系统和订单管理系统等。

    51731130dbe9cf4e071dd72d9e72b933.png
    资料来源:《企业IT架构转型之道》

    把需要重复开发或者重复执行的业务内容整合一个通用的“平台”,大家都能随时从平台中获取想要资源,“中台”便可慢慢建立起来,很好地衔接了企业前台和后台,避免了大量重复”造轮子“的情况。可想而知,这种方式一定会给阿里减少大量的开发成本。

    就在阿里宣布中台战略不久,腾讯、京东、百度相继提出自己的中台战略,就连后起之秀字节跳动也被曝出开始筹备搭建所谓的“直播大中台”,抖音、西瓜视频、火山小视频这几款手机应用的技术和运营团队将被抽出、合并,对该公司旗下所有的直播产品提供支持。

    企业如何做好中台建设

    对企业而言,如何需要建设IT系统,一般需要经过:“业务部门提出需求——IT信息部门开始招投标——需求收集、需求分析——开发——测试——上线”等一系列流程。

    1797996c8475953e1c4e41c62382940d.png

    每个新系统上线都是类似的操作,这就很容易导致很多IT系统板块重复建设,而且系统之间的集成和协作都比较困难。因此,中台建设是企业业务快速发展扩张的过程中势在必行的事情。

    实际上,企业中台的建设不是那么件轻松的事情,但是笔者认为可以从以下几点入手:

    1、建立相关的管理机制

    一个新方案的提出必然会带来一系列的问题,因此相应的管理机制就有先建设好。比如建设管理中台的业务技术人员绩效指标如何衡量,前台业务部门调用中台资源的流程怎么走等等。

    2、深入调研各个板块业务(尤其是前台部分)

    这一步主要的工作内容有两部分:

    1)深入分析企业现有的业务板块存在的衔接性问题,是数据未打通还是技术未跟上,如何才能做到更好的衔接。

    2)找出“重复的轮子”。各个业务板块中有哪些是重复性的工作,这些重复性的工作可否建立统一的标准然后被大家共同调用。

    3、开始业务中台建设

    根据第二部调研得出的结果,实施部门从最基础的应用架构开始,一步步打造与业务、数据等像贴合的业务中台。

    轻流在企业建设中台方面的应用

    了解轻流的用户都知道,轻流是一款支持无代码搭建企业业务管理系统的工具,用可定制的表单、自动化的流程引擎以及强大的可视化报表,给企业各个业务板块的管理提供强有力的系统支持。

    其实,轻流更加强大的是它的对外链接能力,主要包括:

    • Q-Source:从其他系统向轻流添加申请
    • Webhook:从轻流向其他系统发送数据
    • Q-Linker:在轻流查询其他系统数据或向其添加数据
    • OpenApi:在其他系统中查询或添加轻流数据

    8228318e9c516102fc048f80777fc1e0.png

    目前轻流支持上千平台互联,包括前面提到的ERP、OA、CRM等系统,也包括外部的诸如问卷星、钉*钉等平台,拥有高度灵活的拓展性,不管是内部协作还是外部业务,通过轻流都可以进行高度整合。

    那么对企业而言,可以用轻流作为前台系统和后台系统的连接器,打破企业各个业务板块、管理数据之间的信息壁垒,加速企业中台建设,助力企业快速发展。

    以上是对企业中台的简单介绍,欢迎一起讨论。

    展开全文
  • 第(4)节,我们已经对代码生器生成的界面“我的岗位管理”进行了优化,可以看到,...可以看到标红的注解@PreAuthorize("@el.check(‘myJob:list’)"),这是什么意思呢?在IDEA环境下,按住ctrl键点击@el.check,可以

    第(4)节,我们已经对代码生器生成的界面“我的岗位管理”进行了优化,可以看到,与原eladmin的“岗位管理”基本一致,现在我们来看看eladmin是怎么定义权限控制的,并且如何应用到自己的界面当中。

    1. 权限注解理解

    首先用IDEA打开后端“我的岗位管理”的gen模块中的rest层(也就是Controller层),如下图:
    在这里插入图片描述

    可以看到标红的注解@PreAuthorize("@el.check(‘myJob:list’)"),这是什么意思呢?在IDEA环境下,按住ctrl键点击@el.check,可以看到源代码如下:
    在这里插入图片描述
    这里看到注解对应函数check()中定义了一个elPermissions,它是一个List类型,由源代码的定义很容易可以推断出,它就是获取当前登录用户具有的权限,这个权限放在List集合中。再观察return 的内容,elPermissions.contains(“admin”) || Arrays.stream(permissions).anyMatch(elPermissions::contains),这是一个"或"的表达式,只要满足其一就可以通过,通过英文可以推断:

    • elPermissions.contains(“admin”) 表明只要是超级管理员admin就判断为true,admin具有一切权限;
    • Arrays.stream(permissions).anyMatch(elPermissions::contains)表明只要登录用户具有”myJob:list“这个权限就判断为true
      咱们来打个断点debug一下,看看是否推断正确,断点位置如下图:
      在这里插入图片描述

    以admin身份登录

    用户名:admin,密码:123456,admin登录后进入主页按下图点击
    在这里插入图片描述

    进入后台debug界面,看看 elPermissions.contains(“admin”)计算的结果,选中标红的" elPermissions.contains(“admin”)"按右键点击Evaluaute Expression,点击Evaluate可以得到true

    在这里插入图片描述
    在这里插入图片描述
    这说明超级管理员的具有一切权限。

    以test 身份登录

    退出系统,用户名: test ,密码:123456,test登录后按下图点击
    在这里插入图片描述
    进入后端debug界面,可以看到elPermissions到底指什么,其实就是test用户所携带的一些权限
    在这里插入图片描述
    我们再来看看Arrays.stream(permissions).anyMatch(elPermissions::contains)计算的结果,如下图
    在这里插入图片描述
    因为test携带”myJob:list“,因此在经过注解@PreAuthorize("@el.check(‘myJob:list’)")对应的函数时,就可以通过。这下就全明白了。

    2. 用户如何携带权限

    首先应该了解用户的权限对应数据库中的哪一张表,eladmin官方的后端手册指明权限的设置其实是通过“用户-角色-菜单”这样的 的授权模型,官方给出了图解:
    在这里插入图片描述
    我做了标识,其实权限就存在于数据表sys_menu的permission字段中,在SQLyogEnt中我用嵌套sql语句选出了"我的岗位管理"对应的所有权限:
    sql语句为:

    SELECT * FROM sys_menu WHERE pid = (SELECT menu_id FROM sys_menu WHERE title = "我的岗位管理") OR menu_id = (SELECT menu_id FROM sys_menu WHERE title = "我的岗位管理")
    

    对应的权限如下:
    在这里插入图片描述

    3. 界面如何添加权限

    比如给"我的岗位新增”界面添加myJob:add权限,如何操作?其实很简单,还是在菜单管理界面,新增一个菜单,按下图进行填写
    在这里插入图片描述
    然后在角色管理菜单中给普通用户分配刚刚定义的"我的岗位新增”菜单即可, test 属性于普通用户(可以在用户管理界面中查看)
    在这里插入图片描述

    4. 后端验证一下

    我们首先在后端对"myJob:list"进行修改,改为**“myJob:list123”**
    在这里插入图片描述
    然后以test 身份登录,进入“我的岗位管理”界面,出现如下结果:
    在这里插入图片描述
    说明权限设置成功。

    5.总结

    eladmin的这一套权限控制,我们可以在实际的项目中用起来,主要还是使用Spring Security机制,当然shiro框架也可以实现,但是既然想好好学习eladmin,就应该掌握它的一套思想,同时把eladmin中的一些好的类和函数复用到自己的项目中,这才是站在巨人的肩膀上。如果看完觉得有收获,请给我点赞!你们的支持是我更新的动力,下节课还有更重要的内容,敬请期待!让我们一起学习eladmin,一起进步!

    展开全文
  • 之前公司技术分享会时,一...emmmmmm 然后我巴拉巴拉的一推,意思就是说公司后端有一章user表,然后系统做了个权限管理界面,选择莫个人,然后给这人加上什么什么权限,我们在开发的时候,通过后端抛出的全局接口,传..
  • 一个人开发没什么意思,没有什么人可以一起商量讨论,所以一开始代码做不做备份管理都无所谓,反正都一个人在搞。无聊,找了一个已经淘汰的,但实用的源代码管理vss 2005。  在无意之中,vss 2005删除了重安装,...
  • 数据库层就如字面的意思,就是应用程序的后端数据库。中间层就类似Application Server(应用程序服务器)。 中间层 在中间层,更确切的说运行在中间层上的还有几种服务。所有的服务都不相同,有OC4J、report engine...
  • 我的意思是如何给后端发来的图片排序,让几列图片之间的高度差最小? <p>B:(想了一段时间)对不起,这个问题我没有思路。 <p>A:你软件工程专业的对吧?你们...
  • “骨架”是什么意思? Skele(скеле)在马其顿语中是指脚手架。 它也是骨骼的茎(在马其顿语中为скелет)。 它象征着该框架是应用程序赖以保持直立和正常运行的基础。 学分 感谢设计徽标。 执照 :...
  • 关于webshell基本概念

    2019-10-08 21:22:59
    起初的webshell用各种语言(asp,jsp,php等)写的一个管理控制Web服务器的应用程序脚本,可以再web前端后端执行特殊命令,后来的webshell渐渐变味,被黑客利用用作恶意用途,大多植入到网站后台的“后门”文件...
  • 教程安装好ssl证书之后,你就可以适应https://yourDomainName 来访问你的服务器接着就是使用你的Nginx服务器来代理你作为微信小程序后端的nodejs项目了先说说使用Nginx反向代理nodejs项目是什么意思Nginx是安装在你...
  • "cm是什么意思单位", "cm是什么单位的名称" ] } 对于select多选类型表单,默认数据库保存值为半角逗号分隔的多个选择值。当你设置字段类型为无符号整型时,数据库会保存多个选择值的求和值(当然前提是选择值都是...
  • 类hackernews源码iNews.zip

    2019-07-16 07:59:16
    初衷是什么? 赵戈戈:Hacker News从功能和内容本身上来说是个很好的应用,我们最初也是想从开源入手 —— 直接使用,不过HN是甚于Arch实现的,我们对Arch 并不熟悉,所以决定自己写,以便功能扩展。 关于初衷。从...
  • 具体这个产品什么的就不展开讲了,有兴趣的小伙伴可以点进去玩一玩~ 这个项目的1.0乞丐版上线后,需要一个管理系统来管理这个产品,这个时候我手里快言项目的功能已经上线,暂时没有...
  • 让我们不再需要对每一项需要管理的资源都写 N 行重复形式的路由。中文文档见:http://www.golaravel.com/laravel/docs/5.1/controllers/#restful-resource-controllers</p> 我们只需要写一行简单的路由:...
  • 让我们不再需要对每一项需要管理的资源都写 N 行重复形式的路由。中文文档见:https://d.laravel-china.org/docs/5.5/controllers#resource-controllers</p> 我们只需要写一行简单的路由: <pre><code> ...

空空如也

空空如也

1 2 3
收藏数 60
精华内容 24
关键字:

后端管理是什么意思