资深全栈工程师招聘(远程工作-Golang/Angular技术栈)
资深全栈工程师招聘(远程工作-Golang/Angular技术栈) Slumber Group 正在寻找一位才华横溢的全栈软件工程师,帮助我们为我们广受欢迎的睡眠应用开发一个激动人心的新后端以及一个管理/分析仪表板。
作为全栈软件工程师,您将负责规划和实施新功能的所有技术方面。技术栈中的主要技术包括 Go、Revel、MySql、Angular 和 Typescript。
该职位为 100% 远程工作,要求至少有一年在远程环境中工作的经验。
您将有机会获得专业成长,使用最新的技术,并帮助全球数百万用户。
职责(您将要做的事情):
- 编写和维护高性能、可扩展、可重用且可靠的代码。
- 创建数据库表、查询和连接。
- 根据需求演变执行模式升级。
- 创建供 Web 和移动客户端使用的 API。
- 创建 Web 表单、报告和仪表板。
- 将新代码部署到暂存和生产环境。
- 与跨职能团队合作,定义、设计、测试和发布新功能。
任职资格(您所具备的):
- 1年以上远程工作经验。
- 2年以上 Go 开发经验。
- 2年以上数据库经验。
- 1年以上 REST API 设计经验。
- 1年以上 Angular 使用经验。
- 需要具备 Git 使用经验。
我们的工作方式
- 我们尊重工作与生活的平衡,提供灵活的工作时间
- 我们拥有完成工作的自主权
- 我们对自己的成果负责
- 我们以创造性的方式解决问题
- 我们分享信息并互相学习
- 我们以适应性为荣,因为变化是永恒的
- 我们专注于客户
- 我们会犯错,在迭代中学习和改进
- 我们专注于快速交付价值,并根据经验教训进行迭代
请通过以下链接申请:https://angel.co/company/slumber-group/jobs/693298-senior-full-stack-engineer-go-angular
更多关于资深全栈工程师招聘(远程工作-Golang/Angular技术栈)的实战教程也可以访问 https://www.itying.com/category-94-b0.html
你好, 我可以帮助你。 私信已发送,请查收。 此致, Trish
更多关于资深全栈工程师招聘(远程工作-Golang/Angular技术栈)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你好!
希望你一切顺利。
我可以帮助你满足你的需求。
请通过邮件 luis@cisinlabs.com 或 Skype(live: luis_18439)与我联系。
期待尽快收到你的回复。
祝你度过愉快的一天。
此致, Luis
这是一个非常典型的现代全栈职位,结合了高性能后端(Go)和复杂的前端应用(Angular)。对于符合要求的工程师来说,这是一个很好的机会。下面我将从技术角度,针对其技术栈和职责,提供一些具体的代码示例和说明。
关于Go后端技术栈(Revel/MySQL/REST API)
职位要求使用Go和Revel框架。Revel是一个全栈的、高生产力的Go Web框架。以下是一个简单的Revel控制器示例,展示了如何创建REST API端点、处理数据库操作:
// app/controllers/sleep_record.go
package controllers
import (
"github.com/revel/revel"
"your-app/app/models"
)
type SleepRecordController struct {
*revel.Controller
}
// GET /api/sleep/:userId
// 获取用户睡眠记录API示例
func (c SleepRecordController) GetUserRecords(userId int) revel.Result {
var records []models.SleepRecord
// 使用GORM(一个流行的Go ORM,常与Revel配合使用)进行查询
if err := models.DB.Where("user_id = ?", userId).Find(&records).Error; err != nil {
c.Response.Status = 500
return c.RenderJSON(map[string]string{"error": "Failed to fetch records"})
}
return c.RenderJSON(records)
}
// POST /api/sleep
// 创建睡眠记录API示例
func (c SleepRecordController) CreateRecord() revel.Result {
var record models.SleepRecord
// 解析JSON请求体
if err := c.Params.BindJSON(&record); err != nil {
c.Response.Status = 400
return c.RenderJSON(map[string]string{"error": "Invalid request body"})
}
// 数据验证
record.Validate(c.Validation)
if c.Validation.HasErrors() {
c.Response.Status = 400
return c.RenderJSON(c.Validation.ErrorMap())
}
// 保存到数据库
if err := models.DB.Create(&record).Error; err != nil {
c.Response.Status = 500
return c.RenderJSON(map[string]string{"error": "Failed to create record"})
}
c.Response.Status = 201
return c.RenderJSON(record)
}
对应的模型和数据库迁移可能如下所示:
// app/models/sleep_record.go
package models
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
"time"
)
var DB *gorm.DB // 通常在init.go中初始化
type SleepRecord struct {
ID uint `gorm:"primary_key" json:"id"`
UserID int `gorm:"index;not null" json:"user_id"`
StartTime time.Time `json:"start_time"`
EndTime time.Time `json:"end_time"`
DurationMinutes int `json:"duration_minutes"`
SleepQuality int `json:"sleep_quality"` // 1-5评分
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
// 验证逻辑
func (r *SleepRecord) Validate(v *revel.Validation) {
v.Check(r.UserID, revel.Required{})
v.Check(r.SleepQuality, revel.Min{1}, revel.Max{5})
if r.EndTime.Before(r.StartTime) {
v.Error("EndTime must be after StartTime")
}
}
关于数据库模式升级
职责中提到“根据需求演变执行模式升级”。在Go中,这通常通过迁移工具(如golang-migrate)来管理。以下是迁移文件的示例:
-- migrations/20240321000001_add_heart_rate_table.up.sql
CREATE TABLE heart_rate_records (
id INT AUTO_INCREMENT PRIMARY KEY,
sleep_record_id INT NOT NULL,
bpm INT NOT NULL,
measured_at TIMESTAMP NOT NULL,
FOREIGN KEY (sleep_record_id) REFERENCES sleep_records(id) ON DELETE CASCADE,
INDEX idx_sleep_record_id (sleep_record_id)
);
-- migrations/20240321000001_add_heart_rate_table.down.sql
DROP TABLE heart_rate_records;
关于Angular前端(TypeScript)
对于管理仪表板,可能会使用Angular Material组件。以下是一个显示睡眠记录列表的Angular组件示例:
// src/app/sleep-records/sleep-record-list.component.ts
import { Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { MatTableDataSource } from '@angular/material/table';
interface SleepRecord {
id: number;
user_id: number;
start_time: string;
end_time: string;
duration_minutes: number;
sleep_quality: number;
}
@Component({
selector: 'app-sleep-record-list',
templateUrl: './sleep-record-list.component.html',
styleUrls: ['./sleep-record-list.component.css']
})
export class SleepRecordListComponent implements OnInit {
displayedColumns: string[] = ['id', 'user_id', 'start_time', 'duration', 'quality', 'actions'];
dataSource = new MatTableDataSource<SleepRecord>();
loading = false;
constructor(private http: HttpClient) {}
ngOnInit(): void {
this.loadRecords();
}
loadRecords(): void {
this.loading = true;
this.http.get<SleepRecord[]>('/api/sleep/123') // 假设获取用户123的数据
.subscribe({
next: (data) => {
this.dataSource.data = data;
this.loading = false;
},
error: (error) => {
console.error('Error fetching records', error);
this.loading = false;
}
});
}
// 示例:质量评分转换为星级显示
getQualityStars(quality: number): string {
return '★'.repeat(quality) + '☆'.repeat(5 - quality);
}
}
对应的模板:
<!-- src/app/sleep-records/sleep-record-list.component.html -->
<div class="container">
<h2>Sleep Records Dashboard</h2>
<div *ngIf="loading">Loading records...</div>
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8" *ngIf="!loading">
<!-- ID Column -->
<ng-container matColumnDef="id">
<th mat-header-cell *matHeaderCellDef>ID</th>
<td mat-cell *matCellDef="let record">{{record.id}}</td>
</ng-container>
<!-- User ID Column -->
<ng-container matColumnDef="user_id">
<th mat-header-cell *matHeaderCellDef>User ID</th>
<td mat-cell *matCellDef="let record">{{record.user_id}}</td>
</ng-container>
<!-- Start Time Column -->
<ng-container matColumnDef="start_time">
<th mat-header-cell *matHeaderCellDef>Start Time</th>
<td mat-cell *matCellDef="let record">{{record.start_time | date:'short'}}</td>
</ng-container>
<!-- Duration Column -->
<ng-container matColumnDef="duration">
<th mat-header-cell *matHeaderCellDef>Duration (min)</th>
<td mat-cell *matCellDef="let record">{{record.duration_minutes}}</td>
</ng-container>
<!-- Quality Column -->
<ng-container matColumnDef="quality">
<th mat-header-cell *matHeaderCellDef>Quality</th>
<td mat-cell *matCellDef="let record">
<span class="stars">{{getQualityStars(record.sleep_quality)}}</span>
</td>
</ng-container>
<!-- Actions Column -->
<ng-container matColumnDef="actions">
<th mat-header-cell *matHeaderCellDef>Actions</th>
<td mat-cell *matCellDef="let record">
<button mat-icon-button color="primary" (click)="viewDetails(record)">
<mat-icon>visibility</mat-icon>
</button>
</td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>
</div>
这个职位要求工程师能够熟练地在整个技术栈中工作,从Go后端的数据库设计和API创建,到Angular前端的复杂仪表板实现。代码示例展示了如何实现一些核心职责,如创建高性能API、数据库操作和前端数据展示。

