V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  xiaochong0302  ›  全部回复第 8 页 / 共 14 页
回复总数  279
1  2  3  4  5  6  7  8  9  10 ... 14  
2021 年 4 月 23 日
回复了 Renco 创建的主题 程序员 数据库设计太拉跨被喷了。
参考一下我的模型文件:[app/Models/Course.php]( https://gitee.com/koogua/course-tencent-cloud/blob/master/app/Models/Course.php)

我个人觉得不用写注释都能看得一清二楚

```
<?php

namespace App\Models;

use App\Caches\MaxCourseId as MaxCourseIdCache;
use App\Services\Sync\CourseIndex as CourseIndexSync;
use App\Services\Sync\CourseScore as CourseScoreSync;
use Phalcon\Mvc\Model\Behavior\SoftDelete;
use Phalcon\Text;

class Course extends Model
{

/**
* 模型
*/
const MODEL_VOD = 1; // 点播
const MODEL_LIVE = 2; // 直播
const MODEL_READ = 3; // 图文
const MODEL_OFFLINE = 4; // 面授

/**
* 级别
*/
const LEVEL_ENTRY = 1; // 入门
const LEVEL_JUNIOR = 2; // 初级
const LEVEL_MEDIUM = 3; // 中级
const LEVEL_SENIOR = 4; // 高级

/**
* @var array
*
* 点播扩展属性
*/
protected $_vod_attrs = [
'duration' => 0,
];

/**
* @var array
*
* 直播扩展属性
*/
protected $_live_attrs = [
'start_date' => '',
'end_date' => '',
];

/**
* @var array
*
* 图文扩展属性
*/
protected $_read_attrs = [
'duration' => 0,
'word_count' => 0,
];

/**
* @var array
*
* 面授扩展属性
*/
protected $_offline_attrs = [
'start_date' => '',
'end_date' => '',
'user_limit' => 30,
'location' => '',
];

/**
* 主键编号
*
* @var int
*/
public $id = 0;

/**
* 标题
*
* @var string
*/
public $title = '';

/**
* 封面
*
* @var string
*/
public $cover = '';

/**
* 简介
*
* @var string
*/
public $summary = '';

/**
* 关键字
*
* @var string
*/
public $keywords = '';

/**
* 详情
*
* @var string
*/
public $details = '';

/**
* 主分类编号
*
* @var int
*/
public $category_id = 0;

/**
* 主教师编号
*
* @var int
*/
public $teacher_id = 0;

/**
* 原始价格
*
* @var float
*/
public $origin_price;

/**
* 优惠价格
*
* @var float
*/
public $market_price = 0.00;

/**
* 会员价格
*
* @var float
*/
public $vip_price = 0.00;

/**
* 学习期限(月)
*
* @var int
*/
public $study_expiry = 12;

/**
* 退款期限(天)
*
* @var int
*/
public $refund_expiry = 7;

/**
* 用户评价
*
* @var float
*/
public $rating = 5.00;

/**
* 综合得分
*
* @var float
*/
public $score = 0.00;

/**
* 模式类型
*
* @var int
*/
public $model = self::MODEL_VOD;

/**
* 难度级别
*
* @var int
*/
public $level = self::LEVEL_JUNIOR;

/**
* 扩展属性
*
* @var array|string
*/
public $attrs = [];

/**
* 推荐标识
*
* @var int
*/
public $featured = 0;

/**
* 发布标识
*
* @var int
*/
public $published = 0;

/**
* 删除标识
*
* @var int
*/
public $deleted = 0;

/**
* 资源数
*
* @var int
*/
public $resource_count = 0;

/**
* 学员数
*
* @var int
*/
public $user_count = 0;

/**
* 课时数
*
* @var int
*/
public $lesson_count = 0;

/**
* 套餐数
*
* @var int
*/
public $package_count = 0;

/**
* 咨询数
*
* @var int
*/
public $consult_count = 0;

/**
* 评价数
*
* @var int
*/
public $review_count = 0;

/**
* 收藏数
*
* @var int
*/
public $favorite_count = 0;

/**
* 创建时间
*
* @var int
*/
public $create_time = 0;

/**
* 更新时间
*
* @var int
*/
public $update_time = 0;

public function getSource(): string
{
return 'kg_course';
}

public function initialize()
{
parent::initialize();

$this->keepSnapshots(true);

$this->addBehavior(
new SoftDelete([
'field' => 'deleted',
'value' => 1,
])
);
}

public function beforeCreate()
{
if (empty($this->attrs)) {
if ($this->model == self::MODEL_VOD) {
$this->attrs = $this->_vod_attrs;
} elseif ($this->model == self::MODEL_LIVE) {
$this->attrs = $this->_live_attrs;
} elseif ($this->model == self::MODEL_READ) {
$this->attrs = $this->_read_attrs;
} elseif ($this->model == self::MODEL_OFFLINE) {
$this->attrs = $this->_offline_attrs;
}
}

if (is_array($this->attrs)) {
$this->attrs = kg_json_encode($this->attrs);
}

if (empty($this->cover)) {
$this->cover = kg_default_course_cover_path();
} elseif (Text::startsWith($this->cover, 'http')) {
$this->cover = self::getCoverPath($this->cover);
}

$this->create_time = time();
}

public function beforeUpdate()
{
if (time() - $this->update_time > 3 * 3600) {
$sync = new CourseIndexSync();
$sync->addItem($this->id);

$sync = new CourseScoreSync();
$sync->addItem($this->id);
}

if (Text::startsWith($this->cover, 'http')) {
$this->cover = self::getCoverPath($this->cover);
}

if (empty($this->summary)) {
$this->summary = kg_parse_summary($this->details);
}

if (is_array($this->attrs)) {
$this->attrs = kg_json_encode($this->attrs);
}

if (empty($this->origin_price)) {
$this->origin_price = 1.5 * $this->market_price;
}

if ($this->deleted == 1) {
$this->published = 0;
}

$this->update_time = time();
}

public function afterCreate()
{
$cache = new MaxCourseIdCache();

$cache->rebuild();
}

public function afterFetch()
{
$this->origin_price = (float)$this->origin_price;
$this->market_price = (float)$this->market_price;
$this->vip_price = (float)$this->vip_price;
$this->rating = (float)$this->rating;
$this->score = (float)$this->score;

if (!Text::startsWith($this->cover, 'http')) {
$this->cover = kg_cos_course_cover_url($this->cover);
}

if (is_string($this->attrs)) {
$this->attrs = json_decode($this->attrs, true);
}
}

public static function getCoverPath($url)
{
if (Text::startsWith($url, 'http')) {
return parse_url($url, PHP_URL_PATH);
}

return $url;
}

public static function modelTypes()
{
return [
self::MODEL_VOD => '点播',
self::MODEL_LIVE => '直播',
self::MODEL_READ => '图文',
self::MODEL_OFFLINE => '面授',
];
}

public static function levelTypes()
{
return [
self::LEVEL_ENTRY => '入门',
self::LEVEL_JUNIOR => '初级',
self::LEVEL_MEDIUM => '中级',
self::LEVEL_SENIOR => '高级',
];
}

public static function sortTypes()
{
return [
'score' => '综合',
'rating' => '好评',
'latest' => '最新',
'popular' => '最热',
'featured' => '推荐',
'free' => '免费',
];
}

public static function studyExpiryOptions()
{
return [
1 => '1 个月',
3 => '3 个月',
6 => '6 个月',
12 => '12 个月',
36 => '36 个月',
];
}

public static function refundExpiryOptions()
{
return [
0 => '0 天',
7 => '7 天',
14 => '14 天',
30 => '30 天',
90 => '90 天',
180 => '180 天',
];
}

}
```
2021 年 4 月 22 日
回复了 005008 创建的主题 问与答 准备做个前端学习的公众号,起个什么名字好呢
你学废了吗?
好像 oschina 现在发言相关的功能都关闭了
2021 年 4 月 16 日
回复了 nxforce 创建的主题 职场话题 在创业公司混中层好难熬。。。
被 V 友调侃的中层,手动狗头
楼主屯了不少域名呀,有望暴富呀
我这个域名怎么样:koogua.com 续费了 10 多年了
2021 年 4 月 15 日
回复了 onji 创建的主题 分享创造 分享一个自写 API 的大厂图床
最怕的就是禁止外链,显示个404,503之类的
@elone 最好弄一个 demo 分支,针对一些私密的配置项进行脱敏过滤,演示数据定时重置之类的
演示站最好把 post 禁止,搞个计划任务定时重置演示帐号密码
@121 我在深圳,经历过整个流程,已走通所有环节,全是自己办的,谢谢!
便于版本管理和跟踪
注册的时候地址可能都无关紧要,关键是注册后会抽查核实注册地址,还有就是开公司账户比较麻烦(微小企业很多银行都不待见)
2021 年 4 月 12 日
回复了 copper20 创建的主题 程序员 线下面试服装选择 正装 or 其他
短裤+人字拖+蛇皮袋,立马录用
小孩子觉得好玩,大人觉得就是商场,去过一次香港迪士尼,再也不会去了
@k10ndike 直接黑坦克得了
鸣鹤,海鹰, 蛟龙, 蒙冲, 曜阳, 小战, 走舸
2021 年 4 月 2 日
回复了 wenjiu 创建的主题 问与答 请问不开源的软件又不收费,靠什么盈利?
@minami 还有对公帐号的管理费1 k+
2021 年 3 月 29 日
回复了 arongla 创建的主题 问与答 离职了,想做一个自由开发者。
做好一年吃鳖的准备先
1  2  3  4  5  6  7  8  9  10 ... 14  
关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   1002 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 29ms · UTC 22:27 · PVG 06:27 · LAX 14:27 · JFK 17:27
♥ Do have faith in what you're doing.