Coding

Scripts

    Scripts

    更多
    UI

      UI

      更多
      Web

        Web

        更多
        Windows

          Windows

          更多

          知识库分类

          部分笔记结构

          algo ds cpp http flutter

          更多

          Django

          dirtree

          mysite               :pycharm默认的项目根目录,import会正常导入下面的各个目录.
            - db.sqlite3       :对应了models.py.数据库中的表名如:app1_usertype..
            - manage.py        :python manage.py startapp app1
          
            - mysite
              - __init__.py    :python3可以不需要.
              - settings.py    :数据库,指定html路径,指定添加的app..
              - urls.py        :route(rul->method)
              - wsgi.py        :一般会替换为uWSGI+NGINX,性能更好一些.
          
            - templetes        :html
              - master.html    :属于公共的html模板,实现了大部分公共界面,里面预留了一些block,等待他业务html继承.
          
            - static           :js,images,video..  
          
            - app1
              - templetestags
          
                - func.py      :里面定义一些函数共html中使用
              - migrations     :记录数据库的每次修改
          
              - admin.py       :后台管理
              - apps.py        :对当前app1的配置
              - models.py      :每个类都对应了数据中的一张表!
              - views.py       :业务处理,回调函数对应于urls.py.
              - tests.py       :单元测试
          
            - middle
              m1.py            :中间件,对应于settings.py-MIDDLEWARE.
          
          python manage.py createsuperuser  # 建立超级管理员,对应admin.py!
          python manage.py makemigrations  # 修改model后同步到数据库
          python manage.py migrate  # 应用上面的更改
          

          settings.py

          INSTALLED_APPS = (
            ....
            'app1',  # 不然models的类不能配合makemigrations同步到数据库!
          
          )
          
          DATABASES = (
            'default': {
               # django默认使用mysqldb连接,故需要在mysite/__init__.py中需要'import pymysql && pymysql.install_as_MySQLdb()'
               'ENGINE': 'django.db.backends.mysql',
               'NAME': 'dbname',  # 必须是已经创建好的数据库
               'USER': 'root',
               'PASSWORD': 'pwd',
               'HOST': '',
               'PORT': '',
            }
          )
          STATICFILES_DIR = (
            os.path.join(BASE_DIR, 'static'),  # 配置静态文件目录
          
          )
          SESSION_ENGINE='django.contrib.sesssions.backends.cache'  # session默认放在数据库中
          MIDDLEWARE = [
            ....
            'middle.m1.CMiddleWare1',
          ]
          

          models.py

          from django.db import models
          
          class UserType(models.Model):
              # 会隐含的创建id自增主键列.
              name = models.CharField(max_length=32)  # 表UserType的第一列.
          
          class UserInfo:
              '''  其他参数
              blank    :admin中是否可以为空
              help_text:admin中的提示信息
              db_index :是否对该列建立索引,经常做查询key的列需要建立.
              unique   :唯一索引
              auto_now :在更新记录的时候,该列会自动更新时间,精确到微妙!
              auto_now_add :在创建新记录的时候,该列会自动插入当前时间!
              '''
              uid = models.AutoFiedl(primary_key=True)  # 自指定自增列
              username = models.CharField(verbose_name='用户名',max_length=16)  # 用户名可以在views中使用ModeForm使自动取值
              pwd = models.CharField(max_length=16,null=True)  # 注意:若之前其他列都有好多数据了,则新添加的列必须指定值,不然会有提示!
              email = models.EmailField(max_length=16)  # 实际上仅能够对admin的表单数据做验证!
          
              user_type_id = models.IntegerField(choices=((0,'超级用户'),(1,'普通用户')), default=1)  # admin中会显示下拉框
              # 可直接访问关联的表: row.user_type.name
              # 类型是UserType.uid(默认就是主键关联),列明会被自动修改为user_type_id.
              user_type = models.ForeignKey('UserType', to_field='uid')
          
          # 通常在Views.py导入,然后取得数据库的数据后传递给render参数!
          # filter()+values()过滤中使用双下划线用于跨表取数据,相当于对象的点语法!
          models.UserInfo.objects.create(username='root',pwd='123')  # 或-->
          models.UserInfo.objects.filter(username='root').delete()  # 也可以all().delete()
          models.UserInfo.objects.filter(username='root').update(pwd=1)  # 改密码
          models.UserInfo.objects.filter(username='root').first()  # 找到第1个匹配,不存在==None!
          .all().values('col1','user_type__name') # [{'col1':v, 'col2':v}...],限定仅取指定的列
          for r in models.UserInfo.objects.all(): # [userinfo_obj, ...]
              r.id, r.username, r.pwd
          

          admin.py

          后台管理用的,必须把^admin映射添加到urls.py中!

          更多

          会计自动听课脚本

          目的
          • 本脚本主要是辅助会计继续教育官网视频学习, 能够自动答题. 避免为凑足观看学时而一直值守观看的烦恼.
          • 脚本需要放在浏览器插件Tampermonkey中执行.
          // ==UserScript==
          // @name         answering
          // @namespace    http://jxjyxuexi.chinaacc.com
          // @version      0.1
          // @description  try to take over the world!
          // @author       lei
          // @match        http://jxjyxuexi.chinaacc.com/CourseWare/*
          // @grant        none
          // ==/UserScript==
          
          function answering() {
              // get correct answer!
              var ret = commit_user_select("");
              if (!ret || !ret.firstChild)
                  return;
              var ans = ret.firstChild.innerHTML;
              var ajh = ans.indexOf('。');
              if (6<ans.length && ajh>5) {
                  ans = ans.slice(5, ajh);
                  if (ans === '错')
                      ans = 'N';
                  else if (ans === '对')
                      ans = 'Y';
                  // post our answer
                  commit_user_select(ans);
              }
          }
          function commit_user_select(useranswervalue) {
              // parent node must exist!
              if (!document.getElementById('videoPointContent'))
                  return null;
              // var useranswer = document.getElementsByName("useranswer");
              // var useranswervalue = "";
              // for (var i = 0; i < useranswer.length; i++) {
              //     if (useranswer[i].checked) {
              //         useranswervalue += useranswer[i].value;
              //     }
              // }
              //var pointTestUrl = "/CourseWare/1642430/9530/3434/video/PointTest";
              //var nowVideoID = "0101";
              var strUrl = pointTestUrl + "?rnd=" + Math.random();
              try {
                  var xmlHttp = new XMLHttpRequest();
                  var sdata = "testid=" + document.pointform.testid.value + "&useranswer=" + useranswervalue +
                      "&pointnum=" + document.pointform.pointnum.value + "&forumid=" + document.pointform.forumid.value +
                      "&questionid=" + document.pointform.questionid.value + "&pointtype=" + document.pointform.pointtype.value +
                      "&newpointid=" + document.pointform.newpointid.value + "&videoid=" + nowVideoID;
                  xmlHttp.open("Post", strUrl, false);
                  xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                  xmlHttp.send(sdata);
                  //xmlHttp.addEventListener();
                  if (xmlHttp.status == 200) {
                      var xmlDoc = xmlHttp.responseText;
                      eval("var obj =" + xmlDoc);
                      if (obj.Results == "1") {
                          document.getElementById("videoPointBg").style.display = "none";
                          document.getElementById("videoPoint").style.display = "none";
                          setValidTime(obj.MaxPlayTime);
                          playVideo();
                      } else {
                          document.getElementById("PointQuestionAnswer").innerHTML = obj.ReturnStr;
                          return document.getElementById("PointQuestionAnswer");
                      }
                  }
                  return null;
              } catch (e) {
                  return null;
              }
          }
          (function() {
              setInterval(answering, 3000);
          })();
          

          更多

          Snippets

          singleflight

          // 执行并返回给定函数的结果,确保对于给定的键+fn只执行1次
          // 如果有重复的进来,重复的调用者会等待最原始的调用完成并收到相同的结果
          // 返回值 shared 指示是否将 v 提供给多个调用者
          // 返回值 v 是 fn 的执行结果
          // 返回值 err 是 fn 返回的 err
          func (g *Group) Do(key string, fn func()(any, error)) (v any, err error, shared bool)
          // 和 Do 类似,但返回一个 channel, 用来接收结果. Result 是一个结构体,有3个字段(Do返回的那3个)
          func (g *Group) DoChan(key string, fn func() (any, error)) <-chan Result
          // 不走Do的流程,直接调用fn回调
          func (g *Group) Forget(key string)
          

          更多

          Glory C++ 编码规范

          Glory C++ 编码规范

          概述

          • 见名知意:

            • 命名可以无限长。为了准确描述对象,无需简化用词(易造成歧义)
            • 如有缩写(acronym),必须补充完整含义
          • 无歧义

          更多